javascript - apply、arguments、bind 等是 javascript 对象的内部原型(prototype)的一部分吗?

标签 javascript

我一直在阅读有关 javascript 对象不可访问的内部原型(prototype)的文章,我想知道这是否与您在 javascript 数据类型(对象、数组、字符串等)上找到的方法有关?

最佳答案

不,“不可访问的内部原型(prototype)”不是直接相关的。对象有一个“原型(prototype)链”。这就是 JavaScript 继承的方式。

A  ->  B  ->  C  -> null

因此,对对象 A 的失败属性查找将继续对 B 进行查找。 B 上的失败查找将在 C 上继续。如果在 C 上失败,则返回 undefined

关键是将查找从一个对象转移到另一个对象的行为是自动的。你不用手动做。

这是如何工作的,每个对象都通过称为 [[Prototype]] 的内部属性保留对链中下一个对象的引用。根据 ECMAScript 标准,这不是可以直接访问的属性。这就是所谓的不可访问的内部原型(prototype)

A[[Prototype]] == B

B[[Prototype]] == C

C[[Prototype]] == null

所以它可能看起来相关,因为你确实能够从那些构造函数的.prototype对象中获取方法,但是内部不可访问的原型(prototype)是专门指那些内部的使其全部正常工作的对象引用。


虽然不能直接访问该内部属性,但 ECMAScript 5 确实允许开发人员请求该属性持有的对象。您可以使用 Object.getPrototypeOf() 方法执行此操作。

var foo = new String("foobar");

var proto = Object.getPrototypeOf(foo);

所以现在 proto 变量将保存对字符串的内部 [[Prototype]] 保存的对象的引用。该对象恰好是在 String 构造函数的 .prototype 属性中找到的对象。

console.log(proto === String.prototype); // true

console.log(foo.hasOwnProperty("slice")); // false

console.log(foo.slice === String.prototype.slice); // true

所以你可以注意以下几点:

  • 字符串的[[Prototype]]内部属性的值与String.prototype相同,

  • 字符串本身没有.slice属性,

  • 字符串继承 String.prototype.slice 属性。

由于上述隐式查找,它继承了它。所以不是:

A  ->  B  ->  C  ->  null

...原型(prototype)链看起来更像:

       // vv--slice is here
foo  ->  String.prototype  ->  Object.prototype  ->  null

由于 foo 没有 .slice,它会查看其内部的 [[Prototype]],找到那个对象,然后继续查找那里。


编辑:更新为使用 var foo = new String("foobar"); 而不是 var foo = "foobar"; 这样 Object.getPrototypeOf() 就会接受它。

原始值,如字符串原始值(无对象包装器),当您访问其属性时会自动转换为对象包装器,因此以上描述适用于原始值和对象。

关于javascript - apply、arguments、bind 等是 javascript 对象的内部原型(prototype)的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20476255/

相关文章:

javascript - 检查任何数据项上是否不存在类

javascript - 我想在单击关闭按钮 Angular 6 后隐藏 div

javascript - 发现已声明的 undefined variable 的推荐方法

javascript - 单击时调用变量函数

javascript - 解压缩缩小的javascript的合法性

javascript - 带有按钮和输入的弹出式 HTML 内容未呈现

javascript - Jquery 用于动态内容

javascript - 更改 json 对象中的数组条目

javascript - 自定义鼠标光标 Javascript 绘画应用程序

javascript - 我在这个简单的闭包上做错了什么