范围javascript - 字符串和数组/对象时不同

时间:2013-12-22 14:41:10

标签: javascript scope prototype

正在读这个

https://github.com/angular/angular.js/wiki/Understanding-Scopes

并且堆栈溢出时有相同的事情:

What are the nuances of scope prototypal / prototypical inheritance in AngularJS?

这是我不明白的事情:

  

假设我们这样做:

childScope.aString = 'child string'
  

不会查询原型链,并且会向childScope添加新的aString属性。这个新属性使用相同的名称隐藏/隐藏parentScope属性。

     

假设我们这样做:

childScope.anArray[1] = '22'
childScope.anObject.property1 = 'child prop1'
  

查询原型链是因为在childScope中找不到对象(anArray和anObject)。

因此在对象数组示例中 - 更新了父作用域,因为在childScope中找不到对象(anArray和anObject)

但在第一个例子中它是一样的。除了它是字符串。在子范围中找不到它,因此应在父范围内更新。为什么不在父范围内更新?

为什么第二个例子中的数组和对象不是在子范围内创建的?

希望可以根据原始线程创建新线程,因为只是注释它是长文本并且不容易阅读。

1 个答案:

答案 0 :(得分:1)

从某种意义上说,这三个例子都是一样的。在后两个例子中,只有一个额外的对象到对象“跳”。第一个:

childScope.aString = "child string";

只涉及一个对象:“childScope”对象。 (顺便说一句,“范围”这个词让我感到不安,但让我们继续前进。)

第二对示例涉及两个对象:

childScope.anArray[1] = "22";
childScope.anObject.property1 = 'child prop1';

这两个语句中的第一个中的两个对象是“childScope”对象,然后是“childScope”对象的“anArray”属性。据推测,如果语句不会导致错误,那么该属性的就是一个数组。我强调 value ,因为这是对“childScope”属性的引用与第一个示例(“aString”)之间的关键区别 - 在这里,我们需要属性,因为它必须用于后续引用。在第一个“aString”示例中,语句设置值,因此没有查询当前值。

一旦获取了childScope.anArray,那么 对象引用又会在属性引用表达式中使用。这里,与第一个“aString”示例一样,我们设置“anArray”对象的“1”属性的值。这与“aString”示例中的操作完全相同。 (“anObject”示例大致相同。)

设置属性值(或数组元素值;这实际上是相同的事情)时,JavaScript不会在原型链中查找属性。使用属性的时,确实如此。这是一个有趣的效果。在第一个“aString”示例中,如果原型上有“aString”属性,那么一旦在实例(“childScope”)上设置了该属性,那么就实例对象而言,prototype属性实际上是隐藏的。关心。