对象和字符串原型不是已定义字符串的原型?

use*_*944 5 javascript inheritance prototype

我试图了解 JavaScript 的基于原型的继承是如何工作的。我期待以下输出将评估为true. 为什么是这样?

var myStr = "Sample";
String.prototype.isPrototypeOf(myStr); // false
Object.prototype.isPrototypeOf(myStr); // false
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

JavaScript 既有原始字符串,也有字符串对象。你在那里写的是一个原始字符串。该Object.prototype.isPrototypeOf方法始终false为任何原语返回,因此您的结果是有意义的。

如果你使用了一个字符串对象,你会得到true

var myStr = new String("Sample");
console.log(String.prototype.isPrototypeOf(myStr)); // true
console.log(Object.prototype.isPrototypeOf(myStr)); // true
Run Code Online (Sandbox Code Playgroud)


您可能想知道:如果它是一个原始的,那么为什么我可以在其上调用定义在 上的方法String.prototype

答案是规范定义了如果您在原始字符串上使用属性访问器,则会创建一个具有等效字符序列的临时字符串对象String.prototype作为其原型),然后从该临时对象中读取该属性。(数字也是如此。)

我们可以通过向String.prototype返回该对象的方法添加一个方法来证明临时对象是创建的(仅用于说明目的):

Object.defineProperty(String.prototype, "foo", {
  value: function() {
    return this;
  }
});
var primitive = "string";
var object = primitive.foo();
console.log(primitive === object);                      // false
console.log(primitive == object);                       // true
console.log(String.prototype.isPrototypeOf(primitive)); // false
console.log(String.prototype.isPrototypeOf(object));    // true
Run Code Online (Sandbox Code Playgroud)


lau*_*ent 2

这是因为字符串基元不是字符串对象。如果您希望上述代码起作用,则应通过String类构造字符串,如下所示:

var myStr = new String("Sample");
String.prototype.isPrototypeOf(myStr); // true
Run Code Online (Sandbox Code Playgroud)