Javascript 通过更改构造函数属性动态替换原型
我试图制作一些好的代码示例来体验JavaScript的“无类性”。这就是我到目前为止的想法:Javascript 通过更改构造函数属性动态替换原型,javascript,Javascript,我试图制作一些好的代码示例来体验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) cto
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
我的问题是,为什么原型链在这里不起作用?我使用ideone和JavaScript(spidermonkey)(spidermonkey-1.7)运行我的示例。看起来在现实生活中,原型是以某种方式访问的,而不是构造函数
p.S.进一步的实验表明,分配给
obj.constructor
会添加新属性,这会使原始属性变得模糊。为什么?。是的,有对象。\uuuu proto\uuuuu
和直接对象。prototype
。如果您打印一个.prototype,您应该会看到所需的结果。如果您执行console.dir(someInstance)
您将在someInstance
下面直接列出实例变量
之后,您可以展开原型
,您将看到为该原型定义的方法(例如One.prototype.doSomething=function(a){}
)
阅读更多关于
对象的信息。\uuu proto\uuuu
它和更多关于对象的信息。prototype
(标准)。这里的问题是你进入了机械行业,然后开始拉线。这本书中没有什么真正的内容,因为你通过注入这个指针破坏了自然序列
obj.constructor = Two;
这不是继承的正确方式。这是:
function One() {}
function Two() {}
One.prototype.a = 5;
Two.prototype = new One();
Two.prototype.b = 4;
现在,使用
new Two()
实例化的任何对象都将在构造函数中正确显示is-a
关系(继承)。这里是一个显示差异的。最初,您的var obj
没有名为构造函数的属性。当您打印它时,它通过它的原型(One.prototype
)来解析——所有原型都有一个构造函数。当您指定obj.constructor=Two
时,您将在obj
中创建一个自己的属性,该属性将隐藏原型属性。这个新道具对引擎没有任何意义,也不会以任何方式影响继承
一般来说,“构造函数”似乎是一个纯粹的信息属性,没有任何特殊用途。它只是从函数的原型到父函数的反向链接。请参阅和以获取进一步的参考。每个实例的构造函数
属性在内部没有任何用途。我只是假设原型是通过构造函数属性解析的。正如alex23所描述的,我的假设是错误的。这就是我想澄清的全部。谢谢你花时间写你的答案。谢谢,非常合乎逻辑的解释<代码>console.log(One.prototype.hasOwnProperty(“构造函数”)代码>打印true