关于 JS 原型链的补充说明
这篇主要讲一下原型链是怎么样工作的,怎么样从顶层原型链构造出其余的构造函数,比如 Function, String,Array 等。
prototype
只有函数才有 prototype 对象,当把函数当做析构函数来使用时,new 出来的实例会继承 prototype 上的属性和方法。
const test = [1, 2, 3];
test.__proto__ === Array.prototype // true
原型链
原型链的顶端是 Object.prototype, Function.prototype 会继承 Object.prototype.
Function.prototype.__proto__ === Object.prototype // true
Function,Array, Object等构造函数都继承于 Function.prototype.
之所以说 Function 继承于 Function.prototype, 看下面的例子就明白了。
Function.constructor === Function // true
Function.__proto__ === Function.prototype // true
而通过 Function 构造函数构造出了Object, Array,String,Number 等构造函数。
Array.constructor === Function // true
String.constructor === Function // true
因此,可以执行 Array.apply(), 它会照着原型链找到 Function.prototype 上,而 Function.prototype 上存在 apply 这个方法,因此不会报错,同样,Array.toString() ,它也会照着原型链找到 Function.prototype,但是 Function.prototype 不存在 toString 这个方法,这时候它会沿着原型链往上找到Object.prototype, Object.prototype 存在 toString 这个方法,因此可以执行,如果到了 Object.prototype 还没有找到,就会报错。
而 Array 等构造函数的实例会继承构造函数的原型对象,看下面的例子:
const test = [1, 2, 3];
test.toString(); // 1,2,3
test.join(':'); // 1:2:3
Array.prototype.__proto__ === Object.prototype // true
join 方法是在沿着原型链查找过程中在 Array.prototype 上找到的,如果在 Array.prototype 找不到,就会到 Object.prototype 查找,如果还找不到,就会报错, toString 方法就是在 Object.prototype 上找到的。