Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过更改构造函数属性动态替换原型_Javascript - Fatal编程技术网

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

我试图制作一些好的代码示例来体验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
我的问题是,为什么原型链在这里不起作用?我使用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