我们假设我们有以下代码,由于某些原因,我想顽固地改变 a
的原型, b
和 c
到 Obj
的原型。
问题:为什么对象和数组会接受原型的更改,但字符串赢了?
var Obj = function() {}
Obj.prototype = {
log: function(s) {
console.log(s);
}
}
var
a = {1110: "1110"},
b = [1110],
c = "1110";
Object.setPrototypeOf(a, Obj.prototype);
Object.setPrototypeOf(b, Obj.prototype);
Object.setPrototypeOf(c, Obj.prototype);
a.log("shuh");
b.log("shuh");
c.log("shuh");

答案 0 :(得分:2)
那是因为"1110"
不是对象,而是原始string
类型。所以它没有原型的概念。
答案 1 :(得分:1)
您可以将日志方法添加到Object.prototype,所有对象都可以使用它。这样您就不必为对象,数字和字符串创建单独的日志原型,......这是一个这样做的例子
'use strict'
console.clear()
Object.prototype.log = function(s) {
console.log(s);
}
var
a = {1110: "1110"},
b = [1110],
c = "1110";
a.log("shuh");
b.log("shuh");
c.log("shuh");
答案 2 :(得分:1)
您无法更改字符串基元的原型,因为只有对象具有[[SetPrototypeOf]]内部方法。这是有道理的,因为原型确定属性继承,但原始值没有属性,既不拥有也不继承。
但是,您仍然可以更改字符串对象的原型:
var Obj = function() {}
Obj.prototype = {
log: function(s) {
console.log(s);
}
};
var a = {1110: "1110"},
b = [1110],
c = new String("1110");
Object.setPrototypeOf(a, Obj.prototype);
Object.setPrototypeOf(b, Obj.prototype);
Object.setPrototypeOf(c, Obj.prototype);
a.log("shuh");
b.log("shuh");
c.log("shuh");