原型
每个函数都有一个 prototype 属性,这个属性指向一个对象,这个对象就是原型对象。
- 存放一些属性和方法
- 这个对象是给实例对象使用的
尝试重写 push 方法
let arr = [1, 2, 3];
arr.push(4);
console.log(arr);
Array.prototype.mypush = function (...args) {
let len = this.length;
for (let i = 0; i < args.length; i++) {
this[len + i] = args[i];
}
return this.length;
};
arr.mypush(5, 6);
console.log(arr);
__proto__ 属性
每个对象都有一个 __proto__ 属性,这个属性指向它的原型对象。
- 这个属性指向他的原型对象
console.log(arr.__proto__ == Array.prototype);
原型链
当我们访问一个对象的属性时,如果这个对象本身没有这个属性,那么就会沿着__proto__向上查找,这个查找的过程形成的链条就叫做原型链。
原型链的特点:
- 查找属性会沿着原型链一直向上查找,直到找到或者到达原型链的顶端(null)
- 对象的 __proto__指向其构造函数的 prototype
- 原型链的终点是 Object.prototype.__proto__=== null
总结
- 每个函数都有一个 prototype 属性,这个属性指向一个对象,这个对象就是原型对象。
- 每个对象都有一个 __proto__ 属性,这个属性指向它的原型对象。
- 当我们访问一个对象的属性时,如果这个对象本身没有这个属性,那么就会沿着__proto__向上查找,这个查找的过程形成的链条就叫做原型链。