gpt4 book ai didi

javascript - 通过更改构造函数属性动态替换原型(prototype)

转载 作者:行者123 更新时间:2023-11-29 14:57:12 25 4
gpt4 key购买 nike

我正在尝试制作一些好的代码示例来体验 JavaScript 的“无类”。这是我到目前为止想出的:

function One() {}
function Two() {}

One.prototype.a = 5;
Two.prototype.b = 4;

var obj = new One();
print("1) ctor =", obj.constructor, "a =", obj.a, " b =", obj.b);
obj.constructor = Two;
print("1) ctor =", obj.constructor, "a =", obj.a, " b =", obj.b);

var objTwo = new obj.constructor();
print("2) ctor =", objTwo.constructor, "a =", objTwo.a, " b =", objTwo.b);

这些是相应的打印品:

1) ctor = function One() {
} a = 5 b = undefined
1) ctor = function Two() {
} a = 5 b = undefined
2) ctor = function Two() {
} a = undefined b = 4

我的问题是为什么原型(prototype)链在这里不能按照书上的说明工作?我使用 JavaScript (spidermonkey) (spidermonkey-1.7) 在 ideone 中运行我的示例。看起来在现实生活中原型(prototype)是通过 constructor.prototype 以外的方式访问的?

附言进一步的实验表明,分配给 obj.constructor 会添加新属性,这会遮蔽原始属性。为什么?..

最佳答案

最初,您的 var obj 没有名为 constructor 的属性。当您打印它时,它会通过其原型(prototype) (One.prototype) 解析——所有原型(prototype)都有一个构造函数。当您分配 obj.constructor = Two 时,您在 obj 中创建了一个自己的属性,它隐藏了原型(prototype)属性。这个新属性对引擎没有任何意义,也不会以任何方式影响继承。

一般来说,“构造函数”似乎是一种纯粹的信息属性,不用于任何特定目的。它只是从函数原型(prototype)返回到父函数的反向链接。参见 Creating functionsConstruct以供进一步引用。

关于javascript - 通过更改构造函数属性动态替换原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15875644/

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