讲原型链就应该先从构造函数说起,构造函数就是一个函数,例如
构造函数
function Person(){}
以上构造了一个名为Person的函数,每个函数都有一个属性prototype 属性指向函数的原型,
原型是一个对象。
原型默认有 constructor 属性,此属性指向函数本身。
Person.prototype.constructor ==Person //true
那原型链是什么呢,在讲原型链之前还有一个实例需要说明。
实例
实例是构造函数构造出来的实例,实例具有一个默认属性 __proto__ 属性指向原型
构造函数有两个特点,
构造:有构造即创建的功能。
函数:是一个函数,具有函数的所有特征。
构造函数的使用:
function CreateObject(name,age,say){
this.name=name;
this.age=age;
this.say=function(){
console.log(this.name)
};
}
var o=new CreateObject();
使用new操作符创建实例会经历四个步骤:
1,创建一个新对象。
2,将this指向新对象。
3,执行函数内代码。
4,返回对象。
到此,我们可以得到一个构造函数、实例、原型的三角关系图了。
构造函数通过new创建实例对象,
实例通过 __proty__ 属性访问 原型,
原型通过 constructor访问 构造函数,构造函数通过 prototype 访问 原型。
原型链
原型链就是原型的原型 的原型 的原型......
我们知道构造函数和实例都可以访问原型,并且原型的值是可以改变的。
由此,把实例指向的原型值更改为一个其他的构造函数构造的实例,实例默认拥有 __proto__属性,这样原型链就出来了,实例.__proto__.__proto.__proto__,
提示:JS中的所有对象都是继承自Object对象的,所以最后的__proto__会指向 null。
图实:
代码:
function Person(){};
Person.prototype.action="行走";
function Teacher(){};
Teacher.prototype=new Person();
let tA=new Teacher()
浏览器运行结果:
参考文章:
1,关于prototype、__proto__与constructor的图解,写的详细易懂,总结的很好。
https://blog.youkuaiyun.com/cc18868876837/article/details/81211729
2,《JavaScript高级程序设计》第八章。