javascript:有关原型继承的一个令人困惑的问题

问题描述:

我的项目中涉及到JS的原型继承问题。和抽象的主要问题如下:javascript:有关原型继承的一个令人困惑的问题

var parentObj = { 
    value:"parent value", 
    obj: { 
     obj: "parent obj value" 
    } 
} 

var childObj = Object.create(parentObj) 

的文本对象的方式来创建parentObj,并创建一个基于它childObj并使其为原型。

而在第一种情况如下:

childObj.value ="child value" 
childObj.obj = {obj:"child obj value"}; 
console.log(parentObj) 
console.log(childObj) 

输出为:

{ value: 'parent value', obj: { obj: 'parent obj value' } } 
{ value: 'child value', obj: { obj: 'child obj value' } } 

这个结果去预期。

但对于第二种情况如下:

childObj.value ="child value" 
childObj.obj.obj = "child obj value"; 
console.log(parentObj); 
console.log(childObj); 

的输出是:

{ value: 'parent value', obj: { obj: 'child obj value' } } 
{ value: 'child value' } 

parentObj被改变。这个结果对我来说有点困惑,有什么帮助?

+0

我认为这是唯一的孩子对象返回“孩子OBJ值”。 你能再请检查一次吗?或者检查childObj .__ proto__,它会显示parentObj。 – Nitesh

+0

@Nitesh,我确认了我发布的结果。 –

+0

读取'childObj.obj'属性使用原型继承并获得'parent.obj'。此时,'childObj.obj'和'parentObj.obj'是对同一个对象的引用,所以对这个对象的修改都可以通过这两种方法看到。 –

当您使用x = Object.create(y)时,您会收到一个对象x,其中y为其__proto__属性。

__proto__允许在JS性能代表团。

属性委托意味着当您向对象提出属性时,如果该对象没有该对象,对象将询问其父对象(__proto__)。如果父对象也没有它,那么它会询问它的父对象。

如果链耗尽之前找到该值,则返回,否则undefined返回。


在你的情况

var parentObj = { 
    value:"parent value", 
    obj: { 
     obj: "parent obj value" 
    } 
} 

var childObj = Object.create(parentObj) 

parentObjchildObj

console.log(childObj.__proto__ === parentObj) // true 

另外,__proto__childObj有自己的属性命名为.obj.value。 您可以使用Object.getOwnPropertyNames进行检查。 这是确切知道对象上是否存在属性的唯一方法。

console.log(Object.getOwnPropertyNames(parentObj)) // ["value", "obj"] 
console.log(Object.getOwnPropertyNames(childObj)) // [] 

当你做childObj.obj.obj = ...,你修改的对象parentObj.obj的财产.obj

相反,当你做childObj.obj = ...,你childObj添加新属性.obj

childObj.obj = "child obj value" 
console.log(Object.getOwnPropertyNames(childObj)) // ["obj"] 

PS:如果您想了解更多关于兴田的话题,我建议http://www.javascripttutorial.net/javascript-prototype/