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

Why can I not change the prototype of a string?

本文关键字:一个 字符串 原型 不能 能改变 为什么      更新时间:2023-09-26

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

这是因为"1110"不是一个对象,而是一个基本的string类型。所以它没有原型的概念

你不能改变字符串原语的原型,因为只有对象有[[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");

可以为Object添加日志方法。原型和所有对象都会有它。这样,你就不必为你的对象、数字和字符串创建单独的日志原型……下面是一个这样做的例子

'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");