一、原型
原型的作用:①数据共享,节约资源。②继承
例1:
let friend = new Person();
Person.prototype.sayHi = function() {
console.log("hi");
};
friend.sayHi(); // "hi",没问题!
实例之所以能够调用原型的方法是因为,实例与原型之间松散的联系,他先从实例中寻找,发现找不到,然后从原型中寻找找到了,然后输出。
例2:
function Person() {}
let friend = new Person();
Person.prototype = {
name: "Nicholas",
age: 29,
job: "Software Engineer",
sayName() {
console.log(this.name);
}
};
friend.sayName(); // 错误
原因:重写整个原型会切断最初原型与构造函数的联系,但实例引用的仍然是最初的原型。
实例只有指向原型的指针,没有指向构造函数的指针。
二、原型链
定义:
每个构造函数都有一个原型对象,原型有一个属性指回构造函数,而实例有一个内部指针指向原型。如果原型是另一个类型的实例呢?那就意味着这个原型本身有一个内部指针指向另一个原型,相应地另一个原型也有一个指针指向另一个构造函数。这样就在实例和原型之间构造了一条原型链。这就是原型链的基本构想。
特例:
Object.__ proto__ === Function.prototype //true
Object.__ proto__ === Function.__ proto__//true
Object.prototype === Function.prototype.__ proto__ // true
//因此
Function instanceof Object //true
Object instanceof Function //true