这是我的代码:
function Class() {};
Class.prototype.extend = function () {
var instance = new Class();
instance.constructor.prototype = {
say: function () {
console.log("Hello");
}
}
console.log(instance); //Class {extend: function}
}
Class.extend = function () {
this.prototype.extend();
}
Class.extend();
在 extend
方法中,我重写了实例的原型(prototype) instance.constructor.prototype = {..}
,
但是,当我记录实例时,它没有显示 say
方法
为什么重写不起作用?我怎样才能让它发挥作用?
这是demo
最佳答案
您成功更改了 Class.prototype
,但您将其更改为完全不同的对象。
instance
有一个对其原型(prototype)对象的引用,称为 instance.__proto__
。当创建新的 Class
实例时,该实例的 __proto__
指向与 Class.prototype
相同的对象。
但是,您的更改是什么 Class.prototype
指的是。这将影响 future 实例的 __proto__
,但不会影响任何现有实例。 instance.__proto__
仍然指向 Class.prototype
用来引用的旧对象。
这是构造实例
后的第一眼样子:
instance.__proto__ ===> { extend: function } <=== Class.prototype
这是将 Class.prototype
分配给新对象后的样子:
instance.__proto__ ===> { extend: function }
{ say: function } <=== Class.prototype
相反,您想要修改对象Class.prototype
引用:
instance.constructor.prototype.say = function () {
console.log("Hello");
}
这会给你一个像这样的最终图片:
instance.__proto__ ===> { extend: function, say: function } <=== Class.prototype
看到Class.prototype
和instance.__proto__
仍然指向同一个对象,但该对象本身现在有一个额外的属性。
关于javascript - 重写对象的构造函数的原型(prototype)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952098/