Inheritance javascript:关于原型继承的一个混淆点
我在项目中遇到了一个问题,它与JS的原型继承有关。并将主要问题概括如下:Inheritance javascript:关于原型继承的一个混淆点,inheritance,prototype,Inheritance,Prototype,我在项目中遇到了一个问题,它与JS的原型继承有关。并将主要问题概括如下: var parentObj = { value:"parent value", obj: { obj: "parent obj value" } } var childObj = Object.create(parentObj) childObj.value ="child value" childObj.obj.obj = "child obj value"; console.
var parentObj = {
value:"parent value",
obj: {
obj: "parent obj value"
}
}
var childObj = Object.create(parentObj)
childObj.value ="child value"
childObj.obj.obj = "child obj value";
console.log(parentObj);
console.log(childObj);
以文字对象的方式创建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' } }
这一结果与预期相符
但第二种情况如下:
var parentObj = {
value:"parent value",
obj: {
obj: "parent obj value"
}
}
var childObj = Object.create(parentObj)
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
属性为\uuuuuuuuuuuuuu
\uuuu proto\uuuu
允许在JS中进行属性委托
属性委派意味着,当您向对象请求属性时,如果对象没有属性,则对象将询问其父对象(\uuuuu proto\uuuu
)。如果父对象也没有它,那么它将询问它的父对象
如果在链用完之前找到该值,则返回该值,否则将返回undefined
就你而言
var parentObj = {
value:"parent value",
obj: {
obj: "parent obj value"
}
}
var childObj = Object.create(parentObj)
parentObj
是childObj
console.log(childObj.__proto__ === parentObj) // true
另外,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 = "child obj value"
console.log(Object.getOwnPropertyNames(childObj)) // ["obj"]
相反,如果执行childObj.obj=…
,则在childObj
上添加一个新属性.obj
childObj.obj = "child obj value"
console.log(Object.getOwnPropertyNames(childObj)) // ["obj"]
PS:如果您想了解更多关于该主题的信息,我建议您我认为它只返回子对象的“子对象值”。你能再检查一下吗?或者检查childObj.\uuuu proto\uuuu,它将显示parentObj.@Nitesh,我确认了我发布的结果。读取
childObj.obj
属性使用原型继承并获得parent.obj
。此时,childObj.obj
和parentObj.obj
是对同一对象的引用,因此对该对象的修改通过这两种方式都是可见的。