Javascript 当以后再次设置派生对象的属性时,从基对象继承的属性会发生什么变化?

Javascript 当以后再次设置派生对象的属性时,从基对象继承的属性会发生什么变化?,javascript,inheritance,prototype,javascript-objects,Javascript,Inheritance,Prototype,Javascript Objects,此处Object.create()用于继承 JavaScript代码: var x={ a:5, foo:function(){ 归还这个.a*这个.a; } }; var o=Object.create(x); log(“\'x\':”,x); log('Object'o\':',o); log('Property'o.a\':',o.a'); log('Method'o.foo()\':',o.foo()); o、 a=7; console.log('----直接设置o.a后----);

此处Object.create()用于继承

JavaScript代码:

var x={
a:5,
foo:function(){
归还这个.a*这个.a;
}
};
var o=Object.create(x);
log(“\'x\':”,x);
log('Object'o\':',o);
log('Property'o.a\':',o.a');
log('Method'o.foo()\':',o.foo());
o、 a=7;
console.log('----直接设置o.a后----);
log('Object'o\':',o);
log('Property'o.a\':',o.a');

log('Method'o.foo()\':',o.foo())当您尝试访问对象中的属性时,它会尝试在该对象中查找,然后在原型链中查找。因此,通过
o.a
的基本访问可以访问原型链中的属性
a
,直到
o
没有自己的属性为止

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


在您使用的函数中,
。调用
o.foo()
时,此
引用的上下文是对象
o
,因为它有一个自己的属性,名为
a
,值为
7
,所以值
7
在该属性中使用。

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

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

在您使用的函数中,
。调用
o.foo()
时,此
引用的上下文是对象
o
,因为它有一个自己的属性,名为
a
和值
7
,值
7
在其中使用。

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

object_'s_属性。a*object_'s_属性。a
在第一种情况下为5*5。为什么呢?因为搜索从
o
对象开始,并将继续该搜索,直到找到它或点击
null
值aka,原型链的末端。再次,将从
o
开始搜索,然后递归地从其
proto
proto
开始搜索,直到找到属性或点击
null
o.foo()
表示对象
o
从那里调用方法
foo
这意味着,
这个
实际上是对象
o


object_'s_属性。a*object_'s_属性。a
在第一种情况下为5*5。为什么呢?因为搜索从
o
对象开始,并将继续该搜索,直到找到它或点击
null
值aka,原型链的末端。再次,将从
o
开始搜索,然后递归地从其
proto
proto
开始搜索,直到找到属性或点击
null

此行为在

换言之,首先要检查直接提到的对象 这种财产;如果该对象包含命名属性,则 引用所指的财产如果该对象没有 包含命名属性时,将检查该对象的原型 下一个等等

因此,当
o
没有自己的
a
属性时,则对其原型进行了检查,以确定该属性的存在


但是,当
a
成为
o
的自有财产时,它被直接拾取,而无需进入原型链

这一行为在

换言之,首先要检查直接提到的对象 这种财产;如果该对象包含命名属性,则 引用所指的财产如果该对象没有 包含命名属性时,将检查该对象的原型 下一个等等

因此,当
o
没有自己的
a
属性时,则对其原型进行了检查,以确定该属性的存在

但是当
a
成为
o
的自有财产时,直接提取,而无需进入原型链