【问题标题】:What happens to the property inherited from base object when later that property of derived object is set again?当以后再次设置派生对象的属性时,从基础对象继承的属性会发生什么?
【发布时间】:2018-08-12 21:38:24
【问题描述】:

这里Object.create()用于继承。

JavaScript 代码:

var x = {
  a: 5, 
  foo: function() {
    return this.a * this.a;
  }
};

var o = Object.create(x);

console.log('\'x\':', x);
console.log('Object \'o\':', o);
console.log('Property \'o.a\':', o.a);
console.log('Method \'o.foo()\':', o.foo());

o.a = 7;
console.log('-----After setting o.a directly-----');

console.log('Object \'o\':', o);
console.log('Property \'o.a\':', o.a);
console.log('Method \'o.foo()\':', o.foo());

以上代码的输出是:

'x': { a: 5, foo: [Function: foo] }
Object 'o': {}
              __proto__: 
                  a: 5
                  foo: ƒ ()
                  __proto__: Object

Property 'o.a': 5
Method 'o.foo()': 25

-----After setting o.a directly-----

Object 'o': {a: 7}
              a: 7
              __proto__: 
                a: 5
                foo: ƒ ()
                __proto__: Object

Property 'o.a': 7
Method 'o.foo()': 49

所以最初的值a 和函数foo() 是从x 对象派生到o 对象,所以它们在对象o 的原型中。

但是后来当我在对象o中设置a的值时,该对象有一个新属性a:7以及a:5仍然存在于对象o的原型中,奇怪的是函数foo() 返回的是 49(7*7) 而不是 25(5*5)**,这怎么可能?

编辑代码在谷歌浏览器的控制台中运行,输出格式从那里复制

【问题讨论】:

    标签: javascript inheritance prototype javascript-objects


    【解决方案1】:

    此行为在spec 本身中有详细记录

    换句话说,首先检查直接提到的对象 这样的财产;如果该对象包含命名属性,即 引用所指的财产; 如果该对象没有 包含命名属性,检查该对象的原型 下一个;等等

    所以,o 没有自己的a 属性时,然后检查其原型 是否存在该属性。

    但是a成为o的自有财产它被直接拾取而没有进入它的原型链

    【讨论】:

      【解决方案2】:

      当您尝试访问对象中的属性时,它会尝试在该对象中查找,然后在原型链中查找。所以通过o.a 的基本访问可以访问原型链中的属性a,直到o 没有它自己的。

      当您为对象设置原型时,原型属性仅用于读取权限。您可以阅读它们,但是当您尝试更改它的值时,这里 [[Set]] 内部属性可以完成他的工作。它的工作是当您为不存在的属性(自己的属性,而不是原型链中的那些)分配一个值时,它会创建一个然后分配给它。因此,在您的情况下,您没有名称为a 的自己的属性,因此它只是创建一个新属性,使其拥有o 并分配给它。原型的属性现在仍然只能通过直接访问 prototype 来访问。

      在你使用的函数中this。当您调用o.foo() 时,this 所指的上下文是对象o,并且因为它有一个名为a 和值7 的自己的属性,所以值7 在其中使用。

      【讨论】:

        【解决方案3】:

        o.foo() 表示对象o 从那里调用方法foo 这意味着this 实际上是对象o

        object_o's_property.a*object_o's_property.a 在第一种情况下是 5 * 5。这是为什么呢?因为搜索从o 对象开始,并将继续搜索直到找到它或点击null 值,也就是原型链的末尾。同样,将从 o 开始搜索,然后是 protoproto 递归搜索,直到找到属性或点击 null

        【讨论】:

          猜你喜欢
          • 2017-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多