首页 > 解决方案 > 为什么不能重写类的原型?

问题描述

我们可以重写函数的原型,但不能重写类的原型?

    function A() {
    }

    class B {
    }

    let _APrototype   = A.prototype;
    let _BPrototype = B.prototype;

    A.prototype = function () {
    };
    B.prototype = function () {
    };

    console.log(_APrototype == A.prototype); //false
    console.log(_BPrototype == B.prototype); //true

标签: javascript

解决方案


这是因为您实际上并没有设置B.prototype. 你不能设置 Object.prototype。对于Function.prototype,没有什么可以阻止您覆盖该值。请注意我如何可以将 Function.prototype 更改为字符串,而我不能为类。

function A() {
}

class B {
}

let _APrototype   = A.prototype;
let _BPrototype = B.prototype;
console.log(A.prototype);
console.log(B.prototype);

A.prototype = "test A";
B.prototype = "test B";
console.log(A.prototype); // Should have been set.
console.log(B.prototype); // Did not actually set.
    
A.prototype = function () {
};
B.prototype = function () {
};

console.log(A.prototype); // Should have been set.
console.log(B.prototype); // Did not actually set.
    
console.log(_APrototype == A.prototype); //false
console.log(_BPrototype == B.prototype); //true

请注意,您仍然可以将函数添加到类的原型中。你只是无法改变它。这可能是由于持有类的基本对象函数。如果您覆盖它,那么您将丢失所有继承的基础对象函数。

class B {
}

console.log(B.prototype.someMethod1); // Shouldn't exist.
console.log(B.prototype.someMethod2); // Shouldn't exist.
console.log(B.prototype.hasOwnProperty); // Inherited.

B.prototype.someMethod1 = function someMethod1() {
};
console.log(B.prototype.someMethod1); // Should now exist.
console.log(B.prototype.someMethod2); // Still doesn't exist.
console.log(B.prototype.hasOwnProperty); // Inherited.

// This can work depending on which JS features are supported.
B.prototype = {
  someMethod2: function() {
    
  }
}

console.log(B.prototype.someMethod1); // Should be removed now.
console.log(B.prototype.someMethod2); // Should now exist.
console.log(B.prototype.hasOwnProperty); // Inherited even though we completely overwrote the previous set of methods.


推荐阅读