一、构造函数
构造函数是使用了new关键字创建了对象的函数,一般首字母大写,用来和普通函数做区分
function Person(name, age) {
this.name = name;
this.age = age;
this.species = '人类';
this.say = function () {
console.log("Hello");
}
}
let per1 = new Person('xiaoming', 20);
二、原型对象
每一个函数类型的数据都有一个prototype属性,而这个属性指向的对象,就是原型对象
而原型对象的constructor指向的是这个原型对象的构造函数
三、原型链
说原型链之前,先来了解两个概念:
1、显示原型
显示原型就是利用prototype属性查找到的原型
2、隐式原型
隐式原型是利用__proto__属性查找原型,这个属性指向当前对象的构造函数的原型对象,这个属性是对象类型数据的属性,
// 可以得出constructor、prototype和__proto__之间的关系
console.log(per1.__proto__ === Person.prototype); // true
console.log(per2.__proto__ === Person.prototype); // true
3、原型链
既然__proto__是对象类型的属性,原型对象也是对象,那原型对象的__proto__指向的是哪里?
既然原型对象也是对象,那我们只要找到原型对象的构造函数就能知道__proto__的指向了,但在js中,对象的构造函数就是Object(),所以对象的原型就是Object.prototype。但Object.prototype比较特殊,它没有上一层的原型对象,Object.prototype.__proto__返回的是null。
所以上面的关系图拓展为:
如果在某个对象上查找属性,自己没有的就会往原型对象上找,原型对象上没有的会继续往原型对象上的原型对象去查找,直到找到Object.prototype返回null
通过__proto__一层一层往上查找,形成一个像链条一样的结构,这个结构就是原型链。所以原型链也叫作隐式原型链
总结
- 构造函数是使用了new关键字的函数,用来创建对象,所有函数都是Function()的实例
- 原型对象是用来存放实例对象的公有属性和公有方法的一个公共对象,所有原型对象都是Object()的实例
- 原型链又叫隐式原型链,是由__proto__属性串联起来,原型链的尽头是Object.prototype
致敬原作者,通过他的这篇文章终于对原型和原型链有一个比较清楚的认知,想要了解更多内容可以去这里看看:
原型和原型链