【问题标题】:understanding JavaScript Prototypal Inheritance理解 JavaScript 原型继承
【发布时间】:2016-12-19 16:49:52
【问题描述】:

我正在阅读这篇关于角度继承的article,它是由 JavaScript Prototypal Inheritance 开始的。文章说当我们做childScope.aString = 'child string' 新属性隐藏/隐藏同名的parentScope属性,但是当我们做childScope.anArray[1] = 22 属性值在原始对象上更新. 我不明白。
谁能帮忙。
提前谢谢你

【问题讨论】:

  • 我认为更长的摘录会有所帮助。我几乎可以肯定我知道他们在说什么,但你的报价确实具有误导性。
  • 我添加了文章的链接,我的问题是在第一个解释段落s
  • 我认为这取决于对象的类型,如果它是原始对象,那么它将在子勺中创建(如果它不存在),否则它将在父范围

标签: javascript angularjs inheritance


【解决方案1】:

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

function A() {}
A.prototype.b = 'c';

var a = new A();
console.log(a.b);

a 实际上没有属性b,它只是从原型继承而来。现在:

a.b = 'd';

现在已将实际属性b 直接附加到a。原型仍然有一个属性b = 'c',但在a 上不再可见。 a.b 现在是 'd'

this 和a.anArray[1] = 22 之间的区别在于,您在此处修改一个可变对象。您没有分配给a 上的属性,而是从a 获取属性,然后对其进行修改。这不会改变a,它会改变对象anArray 的实例。可以访问 anArray 的所有内容都可以看到。

【讨论】:

  • 谢谢你的回复,但我还是不明白。你说`你从a获取一个属性然后修改它。`,但是a没有一个名为@的属性987654340@
  • @aName 执行 a.anArray = [10,22,30] 在文章中有助于定位差异。做a.b = ... 是覆盖b。执行a.b[i] = ... 不是覆盖b,而是覆盖b 中索引i 处的值。
  • 所以它取决于属性的类型是对象还是原语
  • @aName 不,这取决于您是分配给属性还是修改它。是的,这在某种程度上取决于属性的类型,因为原语是不可修改的。但是您可以轻松地为曾经是数组的属性分配一个新值。
【解决方案2】:
childScope.aString = 'child string'
childScope.anArray[1] = 22

在第一种情况下,分配是直接对属性的进行的。 JavaScript 向子作用域添加了一个新属性。

在第二种情况下,对属性的内容进行了分配。由于子作用域上不存在该属性,因此 JavaScript 搜索原型链以找到现有的 内容 并对其进行修改。

如需进一步阅读,请参阅AngularJS Wiki -- Understanding Scopes and the Nuances of Prototypical Inheritance

【讨论】:

    【解决方案3】:

    属性访问解析可以作为对属性的写入或读取操作的一部分进行。原型继承表示只有解析作为读取操作的一部分才应该涉及继承的属性查找。

    您的第一个场景涉及对属性的写操作 - 因此不会查找继承的属性。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多