Javascript 当以后再次设置派生对象的属性时,从基对象继承的属性会发生什么变化?
此处Object.create()用于继承 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后----);
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
的自有财产时,直接提取,而无需进入原型链