Inheritance javascript:关于原型继承的一个混淆点

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.

我在项目中遇到了一个问题,它与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.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
是对同一对象的引用,因此对该对象的修改通过这两种方式都是可见的。