我已经广泛阅读了有关Javascript原型继承的信息,特别是在子作用域中。我的理解是,我们始终确保“。”在我们的ng-model绑定中,以便它引用一个对象。

我的问题是...为什么原型继承会在其本地范围内创建一个原语而不是对象?似乎是同一回事。

在一种情况下,我们有一个原始的。在另一种情况下,我们有一个对象-说一个数组。更令人困惑的是,我可以将对象传递给子作用域(不带“。”),并且通过将数据推入在本地作用域内向下传递的对象上,父对象仍然被修改,因此没有子数组对象被建造。同样,为什么呢?原型继承似乎会自动创建基元……是什么使对象与众不同?

最佳答案

这是从父作用域创建子作用域的简化(示例)版本。要获得更全面的视图-转到source

父范围已创建:

function Scope(){ };
var scope = new Scope(); // scope instance is created


假设它具有一些原始属性和一些对象属性:

scope.a = 1;
scope.obj = {a: 1};


创建子作用域实例,其原型为“作用域”

function ChildScope(){ };
ChildScope.prototype = scope;
var childScope = new ChildScope(); // an instance of the child scope


现在,让我们看看:

console.log(scope.a);          // should be 1
console.log(childScope.a);     // should be 1
console.log(scope.obj.a);      // should be 1
console.log(childScope.obj.a); // should be 1


不出所料吧?

如果我们现在在childScope中公开的属性上设置值

childScope.a = 2;
childScope.obj.a = 3;


然后是输出:

console.log(scope.a);          // should still be 1
console.log(childScope.a);     // should be 2 now
console.log(scope.obj.a);      // should be 3
console.log(childScope.obj.a); // should be 3


jsFiddle

因此,当您对基元数组:ng-repeat进行item in ["a", "b",...]且在其中使用<input ng-model="item">时,实际上就是在执行childScope.item = "..."

10-05 20:53
查看更多