Javascript AngularJS$scope原型继承-原语与对象?

Javascript AngularJS$scope原型继承-原语与对象?,javascript,angularjs,scope,Javascript,Angularjs,Scope,我已经广泛阅读了有关Javascript原型继承的内容,特别是在子作用域中。我的理解是,我们总是确保ng模型绑定中有一个“.”,以便它引用一个对象 我的问题是。。。为什么原型继承在其局部作用域上创建一个基元而不是一个对象?看起来是一样的 在一个例子中,我们有一个原语。在另一种情况下,我们有一个对象,比如说一个数组。更令人困惑的是,我可以将一个对象传递给子范围(不带“.”),通过将数据推送到在本地范围内传递的对象上,父对象仍然会被修改,因此不会创建子数组对象。再说一遍,为什么?原型继承似乎可以自动

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

我的问题是。。。为什么原型继承在其局部作用域上创建一个基元而不是一个对象?看起来是一样的

在一个例子中,我们有一个原语。在另一种情况下,我们有一个对象,比如说一个数组。更令人困惑的是,我可以将一个对象传递给子范围(不带“.”),通过将数据推送到在本地范围内传递的对象上,父对象仍然会被修改,因此不会创建子数组对象。再说一遍,为什么?原型继承似乎可以自动创建原语。。。是什么让一个对象与众不同?

下面是一个简化版本,说明如何从父范围创建子范围。要获得更全面的视图,请访问

父作用域已创建:

function Scope(){ }; 
var scope = new Scope(); // scope instance is created
假设它有一些基本属性和一些对象属性:

scope.a = 1;
scope.obj = {a: 1};
创建子范围实例,其原型为“范围”

现在,让我们看看:

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


因此,当您在原语数组上执行
ng repeat
时:
项在[“a”、“b”、…]中,并在其中使用
,您实际上是在执行
childScope.item=“…”

原型继承不会创建任何东西。角度将属性添加到当前范围。属性是原语还是对象也不重要,重要的是。对象位于父作用域上,并进行了适当修改,而基本体则没有。我试图理解为什么会是这样。这个问题太广泛了,没有一些可能会引起你们困惑的例子。我不同意@zeroflagL,尽管关于
并不重要,因为一旦作用域转变为子作用域,什么保持绑定,什么不受约束肯定会很重要;Charles和@charlietfl,也许我不够明确或者误解了这个问题。问题是:为什么原型继承在其局部作用域上创建一个原语而不是一个对象。因此,如果您有
ng model=“something.text”
,则
text
将添加到
范围.something
。但是如果对象
something
在作用域链中的某个位置不存在,那么它将被创建并添加到当前作用域中。如果你的意思不同,Charles,请重新表述这个问题。这个答案并没有真正解释OP的为什么问题,请参考这个问题以获得更广泛的答案:为什么来自JS中原型继承的行为,我已经展示了如何创建子作用域,并将父作用域作为其原型。有一个重复的问题和答案是另一回事。
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