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
被改变。这个结果对我来说有点困惑,有什么帮助?
答
当您使用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)
parentObj
是childObj
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/
我认为这是唯一的孩子对象返回“孩子OBJ值”。 你能再请检查一次吗?或者检查childObj .__ proto__,它会显示parentObj。 – Nitesh
@Nitesh,我确认了我发布的结果。 –
读取'childObj.obj'属性使用原型继承并获得'parent.obj'。此时,'childObj.obj'和'parentObj.obj'是对同一个对象的引用,所以对这个对象的修改都可以通过这两种方法看到。 –