javascript - 重写对象的构造函数的原型(prototype)不起作用

标签 javascript prototype

这是我的代码:

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.prototypeinstance.__proto__仍然指向同一个对象,但该对象本身现在有一个额外的属性。

关于javascript - 重写对象的构造函数的原型(prototype)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952098/

相关文章:

javascript - 我如何找出哪个字符在退格键的 tinymce 编辑器中被删除(在它实际被删除之前)?

javascript - 匀场映射/减少/过滤器在 Exploder 6/7/8 中工作吗?

javascript - 为什么无法 Array.prototype.pop.call() 字符串?

javascript - 当 thisArg 与后续参数属于同一个数组时,function.prototype.apply 如何工作

javascript - 在 JavaScript 类中处理 DOM 事件

javascript - 关联数组查找(来自 Three.js 中的代码)

javascript - Codemirror 中的最大长度

javascript - 我用于页面的 jQuery UI 可排序元素不起作用?

javascript - 如何每秒将变量增加 (x) 个单位,然后将变量与 Date() 一起使用来确定自月初以来的单位数

Javascript:如何将函数的原型(prototype) append 到另一个函数的原型(prototype)?