javascript - Object 和 String 原型(prototype)不是定义字符串的原型(prototype)吗?

标签 javascript inheritance prototype

我想了解 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/

相关文章:

javascript - 使用基于 sip.js 的 webrtc 应用程序和 asterisk 11.11.0 时,chrome 没有音频。与 Firefox 和 Opera 配合良好

javascript - 什么是删除大写字母之间的空格但保留单词之间的空格的正则表达式?

java - 遵守 JavaBeans 命名标准是否有助于实现封装?

c++ - 基类中的私有(private)元素是否会增加派生类的大小?

Spring - 简单地创建Supplier<MyPrototypeBean>

javascript - “this”在 Node.js HTTP 回调中丢失上下文

javascript - jQuery 从特定子节点获取链接

c++ - 在 C++ 中继承私有(private)成员

javascript - Array.prototype.each = function(callback) { for (var i = 0; i < this.length; i++) callback(this[i]); } } - 这个可以吗?

Javascript - 如何检测两个数组的差异