原型链是什么呢?先简单了解一下概念
原型链是一种查找规则:
实例对象在获取属性和方法时,会依次从 实例对象本身 => 实例对象的原型对象(proto),也就是构造函数的prototype => 原型对象的原型对象 ; 以此类推,一直找到Object.prototype.proto,因为Object.prototype.proto__的值为 null , null没有__proto ,查找到这里就结束了,没有找到的话返回undefined
再扩展一下知识点 原型对象
什么是原型对象呢?每一个函数都有一个prototype(原型),每个对象都有一个__proto__ 属性;它们都指向原型对象
这里用构造函数来更好的理解一下吧(es6箭头函数不支持)
function Person () {
}
const p = new Person();
console.log(Person)
console.log(p.__proto__,Person.prototype);
console.log(p.__proto__ === Person.prototype); // true
看一下执行结果吧
原型对象里面有个constructor,看着和Person 很像,执行一下看看是否相等
function Person () {
}
const p = new Person();
console.log(Person.prototype.constructor === Person);
console.log(p.__proto__.constructor === Person)
两个都是true,看来prototype和__proto__的constructor 就是Person
上面用到了 new Person ,new具体做了什么呢? 下面来看一下
先看一下原生的new 之后返回的是什么
function Person () {
}
const p = new Person();
console.log(p)
function函数还有个this指向问题,看看new Person之后的this是谁
function Person () {
console.log(this)
}
const p = new Person();
this和上面执行的p 的值是一样的,看来构造函数的this指向的是 new 返回的实例对象
new 之后返回了一个对象,并且我们上面已经验证过 p.__proto === Person.protype、p.__proto.constructor === Person;按照上面的验证结果来实现一下
function myNew (Fn) {
// 先创建一个对象,因为需要返回一个对象
let obj = {};
// obj的__proto__ 和 Fn的prototype是相等的
obj.__proto__ = Fn.prototype;
// obj.__proto.constructor === Fn
obj.__proto__.constructor = Fn;
// new 之后 Fn this指向返回的obj,并且Fn是立即执行的
obj.__proto__.constructor.call(obj)
return obj;
}
function Person () {
}
const p = myNew(Person);
console.log(p);
看一下执行结果
成功了,和new 的执行结果一样