javascript - 为什么不能重写类的原型?
问题描述
我们可以重写函数的原型,但不能重写类的原型?
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
解决方案
这是因为您实际上并没有设置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.
推荐阅读
- c# - 使用多年后更新数据库
- neo4j - NEO4J BoltConnectionError:未找到连接,您连接到 Neo4j 了吗?
- javascript - 访问本地目录以从 localhost 检索文件并回写
- javascript - Postgres Javascript Promise 不返回修改后的结果
- python - 使用 Lambda 更新文本文件
- javascript - DataTable - 使值可排序
- loops - 通过数据值向后循环
- xml - 试图在同一个 XML 文档中使用 XSLT 和 Key 函数查找相关值
- android - 可以看到任何图像
- go - 未能验证 ECDSA 签名