为什么我不能改变字符串的原型?

时间:2016-09-19 00:30:08

标签: javascript

我们假设我们有以下代码,由于某些原因,我想顽固地改变 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");




3 个答案:

答案 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");