我想了解 JavaScript 基于原型(prototype)的继承是如何工作的。我原以为下面的输出会被评估为 true
。这是为什么?
var myStr = "Sample";
String.prototype.isPrototypeOf(myStr); // false
Object.prototype.isPrototypeOf(myStr); // false
最佳答案
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
您可能想知道:如果它是一个原始,那么为什么我可以在其上调用定义在 String.prototype
上的方法?
答案是规范定义如果你在一个原始字符串上使用属性访问器,一个临时字符串object会被创建一个具有等效字符序列的对象(使用String.prototype
作为其原型(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
关于javascript - Object 和 String 原型(prototype)不是定义字符串的原型(prototype)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41127095/