在这里,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中设置o的值时,对象具有一个新的属性a:7,而a:5仍然存在于对象o的原型中,奇怪的是函数foo()返回的是49(7*7)而不是25(5*5)**,这怎么可能?
编辑:代码在Google的控制台中运行,输出格式是从那里复制的
发布于 2018-03-05 11:49:23
这种行为在等级库本身中有很好的文档说明。
换句话说,首先检查直接提到的对象是否具有这样的属性;如果该对象包含命名属性,即引用引用所引用的属性;如果该对象不包含命名属性,则接下来检查该对象的原型;等等,。
因此,当o没有自己的a属性时,就会对的原型进行检查,以确定是否存在该属性。
但是当a成为o自己的财产时,就被直接捡起来,而没有去它的原型链。
发布于 2018-03-05 09:21:36
当您试图访问对象中的属性时,它尝试在该对象中查找,然后在原型链中查找。因此,通过o.a进行的基本访问可以访问prototype链中的属性a,直到o没有自己的属性为止。
当为对象设置原型时,原型属性仅用于read access。您可以阅读它们,但是当您试图更改它的值时,此处[Set]内部属性将完成他的工作。它的工作是当您为不存在的属性(自己的属性,而不是原型链中的属性)赋值时,它创建一个属性,然后分配给它。因此,在您的示例中,您没有自己的名为a的属性,因此它只是创建了一个新属性,使其成为o的属性并分配给它。原型的属性现在仍然只能通过直接访问prototype来访问。
在函数中使用了this。当您调用o.foo()时,this引用的上下文是对象o,并且由于它有一个具有名称a和值7的属性,所以在其中使用值7。
发布于 2018-03-05 09:35:35
o.foo()意味着对象o从那里调用方法foo,这意味着this实际上是对象o。
object_o's_property.a*object_o's_property.a在第一种情况下是5 *5,为什么?因为搜索从o对象开始,并将继续搜索,直到它创建它或命中null值(也就是原型链的末尾)。同样,将从o开始搜索,然后递归地启动它的proto和proto,直到找到属性或命中null。
https://stackoverflow.com/questions/49106960
复制相似问题