原型,原型对象,原型链
原型和原型对象
只要创建一个函数,浏览器就会自动为其分配一个原型,可以通过prototype属性访问到原型,原型也可以通过constructor属性访问到其对应的函数,此外,通过函数创建的实例对象默认可以通过_proto_属性访问到原型对象(注:_proto_属性不是标准属性,最好不要用在生产环境中)。
Person(name,age){
this.name=name;
this.age=age;
}
console.log(Person.prototype);//输出对应原型
console.log(Person.prototype.constructor);//输出函数本身
var zs=new Person("秋风",100);//创建了一个实例对象
console.log(zs._proto_);//指向原型
为什么要设置原型
方法如果写在原型上,可以解决内存浪费的问题,而且也可以很好的解决函数写在外面容易重名的问题。如Array对象的方法,如foreach,every,都是写在原型上,可以通过实例去访问。
Person(name){
this.name=name;
}
Person.prototype.sayHi=function(){
console.log("你好呀");
}
var zs=new Person(“秋月”);
zs.sayHi();
原型链
从前面已经知道,函数创建出来的实例对象默认是可以访问到原型的,但其实原型也是其他的函数的实例,可以一直往上寻找,直到找到null,所以就形成了一个链状结构。
所以当实例查找某个属性时,先在自己身上找看有没有,如果没有就沿着原型链往上面找,直到找到null都没有的话,就返回undefined。