gpt4 book ai didi

javascript - "setting object properties"如何在派生对象上工作(以及这与设置基元有何不同)

转载 作者:行者123 更新时间:2023-12-03 12:27:38 25 4
gpt4 key购买 nike

我以为我掌握了原型(prototype)继承,但现在可以在派生对象上设置对象属性。考虑这段代码:

var com_mtag = {};
com_mtag.start = function(){
// creating myBase and setting a string property and an object-property
// both have a "prop" property set to "Base"
com_mtag.myBase = {};
com_mtag.myBase.prop = "Base";
com_mtag.myBase.obj = {prop: "Base"};

// Now derive myObj from myBase...
com_mtag.myObj = Object.create(com_mtag.myBase);

// modifying prop and obj.prop via the derived object
com_mtag.myObj.prop = "Derived";
com_mtag.myObj.obj.prop = "Derived";
};

结果是这样的:1) myBase 和 myObj 都有一个属性“prop”,其值分别为“Base”和“Derived”(如预期)2) 但 myBase.obj 和 myObj.obj 指向同一个对象,该对象现在具有值 prop="Derived"

这是如何工作的?我了解到,在设置对象属性时,解释器不会沿着原型(prototype)链向下,而是在执行“设置”的实例上创建属性(它对字符串属性执行此操作)。但是解释器如何处理对象属性的设置呢?它必须沿着链条向下才能找到该物体。它是否在派生对象中创建了对此对象的新引用?

希望我能表达清楚(当我读到这篇文章时我对此表示怀疑,但我无法更好地解释),我非常感谢任何人对此进行阐明。

最佳答案

I've learned that when setting object properties, the interpreter will not go down the prototype chain but create the property on the instance where the "set" was performed

是的,这是真的,但是访问链中的每个属性 com_mtag.myObj.obj读取属性值,而不是设置它们。只有.prop最后实际上设置了任何东西。

当您在对象上设置属性时,您正在设置该对象的自己的属性(我们说“自己的”属性是为了将它们与继承的原型(prototype)属性区分开来),这隐藏任何同名的原型(prototype)属性。这就是为什么您可以隐藏继承的 com_mtag.myObj.prop具有新值:com_mtag.myObj获得自己的prop属性。

但是,与 com_mtag.myObj.obj.prop ,您设置作为 myBase 的属性存在的对象的属性。原型(prototype)。在这种情况下,com_mtag.myObj 没有获得自己的obj属性,因为您没有设置 obj ;您只是在阅读它。

com_mtag.myObj没有自己的obj属性(property),所以com_mtag.myObj.obj必须引用存储在原型(prototype)的 obj 中的值属性(property),即com_mtag.myBase.obj 。因此,com_mtag.myObj.obj.propprop该对象的属性。

如果您给出 com_mtag.myObj自己的obj属性(property),然后 com_mtag.myObj.obj.prop将设置 prop关于 obj 中存储的值。自 com_mtag.myObj它自己没有这样的属性,它必须使用存储在 com_mtag.myBase.obj 的对象查找要设置的对象 prop上。

考虑使用 prop 创建新对象的可能性属性,并将整个对象存储在 com_mtag.myObj.obj 中:

com_mtag.myObj.obj = { prop: "Derived" };

没有像那样创建新对象,只有原始原型(prototype) obj对象存在。 JavaScript 引擎不会在 myObj.obj 上创建新对象;它将使用原型(prototype)上的那个。

关于javascript - "setting object properties"如何在派生对象上工作(以及这与设置基元有何不同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24105838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com