AngularJS $范围原型继承 - 原始与对象?

时间:2015-01-10 21:15:14

标签: javascript angularjs scope

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

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

在一个案例中,我们有一个原始的。在另一种情况下,我们有一个对象 - 比如一个数组。更令人困惑的是,我可以将一个对象传递给子作用域(没有“。”),并且通过将数据推送到在本地作用域内传递的对象,父对象仍然被修改,因此没有子数组对象被建造。再次,为什么?原型继承似乎是自动创建原语......是什么让对象变得不同?

1 个答案:

答案 0 :(得分:1)

这是一个简化的(例子)版本,用于从父作用域创建子作用域。要获得更全面的视图,请转到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 = "..."时,您实际上正在执行{{1}}。

相关问题