我一直在阅读有关 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/