理解JavaScript原型继承

理解JavaScript原型继承,javascript,angularjs,inheritance,Javascript,Angularjs,Inheritance,我正在阅读这篇关于角度继承的文章,它是从JavaScript原型继承开始的。文章说,当我们做childScope.aString='child string'时,新属性会隐藏/隐藏同名的parentScope属性,但当我们做childScope.anArray[1]=22时,属性值会在原始对象上更新。我不明白这一点。 有人能帮忙吗。 提前感谢a.b=c为对象a的属性b显式赋值。这将覆盖所有隐式继承的属性。具有实际继承的实际Javascript中的示例: 函数A(){} A.prototype.

我正在阅读这篇关于角度继承的文章,它是从JavaScript原型继承开始的。文章说,当我们做
childScope.aString='child string'
时,新属性会隐藏/隐藏同名的parentScope属性,但当我们做
childScope.anArray[1]=22
时,属性值会在原始对象上更新。我不明白这一点。
有人能帮忙吗。

提前感谢

a.b=c
为对象
a
的属性
b
显式赋值。这将覆盖所有隐式继承的属性。具有实际继承的实际Javascript中的示例:

函数A(){}
A.prototype.b='c';
var a=新的a();

控制台日志(a.b)
a.b=c
为对象
a
的属性
b
显式赋值。这将覆盖所有隐式继承的属性。具有实际继承的实际Javascript中的示例:

函数A(){}
A.prototype.b='c';
var a=新的a();

控制台日志(a.b)属性访问解析可以作为属性写入或读取操作的一部分进行。原型继承说,只有作为读取操作一部分的解析才应该涉及继承属性查找

第一个方案涉及对属性进行写操作,因此不会查找继承的属性


但是,在第二种情况下,属性查找是作为属性索引查找的一部分进行的,而不是作为属性写入操作的一部分进行的-即读取操作,因此继承属性的查找不可能作为属性写入操作或读取操作的一部分进行。原型继承说,只有作为读取操作一部分的解析才应该涉及继承属性查找

childScope.aString = 'child string'
childScope.anArray[1] = 22
第一个方案涉及对属性进行写操作,因此不会查找继承的属性

但是,在第二种情况下,属性查找是作为属性索引查找的一部分进行的,而不是对属性的写入操作-即读取操作,因此不会查找继承的属性

childScope.aString = 'child string'
childScope.anArray[1] = 22

在第一种情况下,直接对财产的价值进行转让。JavaScript向子作用域添加了一个新属性

在第二种情况下,对财产的内容进行转让。由于子作用域上不存在该属性,JavaScript将搜索原型链以查找现有内容并对其进行修改

如需进一步阅读,请参阅

在第一种情况下,直接对财产的价值进行转让。JavaScript向子作用域添加了一个新属性

在第二种情况下,对财产的内容进行转让。由于子作用域上不存在该属性,JavaScript将搜索原型链以查找现有内容并对其进行修改


如需进一步阅读,请参阅。

我认为较长的摘录会有所帮助。我几乎可以肯定我知道他们在说什么,但你的引用确实有误导性。我添加了文章的链接,我的问题是在第一个解释段落中。我认为这取决于对象的类型。如果它是一个原语,那么它将在子类独家新闻中创建(如果它不存在),否则它会在父范围中查找它,我认为更长的提取时间会有所帮助。我几乎可以肯定我知道他们在说什么,但你的引用确实有误导性。我添加了文章的链接,我的问题是在第一个解释段落中。我认为这取决于对象的类型。如果它是一个原语,那么它将在子类独家新闻中创建(如果它不存在),否则它会在父作用域中查找。谢谢您的响应,但我还是不明白。您说“您将从a获取一个属性,然后对其进行修改。”但是a没有名为
anArray
@aName Doing a.anArray=[10,22,30]将是本文中有用的补充,以将差异本地化。执行
a.b=…
正在覆盖b。执行
a.b[i]=…
并不是覆盖b,而是覆盖b中索引i处的值。因此,它取决于属性的类型(如果它是对象或属性)primitive@aName否,这取决于是指定给属性还是修改属性。是的,这在某种程度上取决于属性的类型,因为原语是不可修改的。但是你也可以很容易地为一个以前是数组的属性分配一个新值。谢谢你的回答,但我还是不明白。你说“你从a获得一个属性,然后修改它。”但是a没有一个名为
anArray
@aName Doing a.anArray=[10,22,30]将是本文中有用的补充,以将差异本地化。执行
a.b=…
正在覆盖b。执行
a.b[i]=…
并不是覆盖b,而是覆盖b中索引i处的值。因此,它取决于属性的类型(如果它是对象或属性)primitive@aName否,这取决于是指定给属性还是修改属性。是的,这在某种程度上取决于属性的类型,因为原语是不可修改的。但是,您可以同样轻松地为以前是数组的属性指定一个新值。