原型
- 所谓原型就是一个特殊的对象,当函数以构造函数调用时,它所创建的对象会有一个隐含的属性,指向该构造函数的原型对象
- 原型对象就相当于一个公共区域,所有同一个类的实例都可访问到到这个原型中的属性和方法,就类似与java中的静态变量和静态方法
- 一般我们会将许多对象的共有内容(属性和方法)抽取出来放在原型中,避免多次加载浪费资源
原型链以及查找顺序
每个对象都可以有一个原型_proto_
,这个原型还可以有它自己的原型,以此类推,形成一个原型链。查找特定属性的时候,我们先去这个对象里去找,如果没有的话就去它的原型对象里面去,如果还是没有的话再去向原型对象的原型对象里去寻找,直到找到null(Object的原型的原型是null)
原型的使用
- 提供共有的属性和公用的方法
例如
functon People(name.age){
this.name=name;
this.age=age;
}
People.prototype.sayName=function(){
console.log(this.name);
}
//所有由People构造函数创建的对象都可以调用sayName方法
var people = new People ("孙悟空",18);
people.sayName();//将会在控制台打印孙悟空
- 扩展内置队形的方法
例如
Array.prototype.sum=function(){
var sum = 0;
for(var i=0;i<this.length;i++){
sum+=this[i];
}
return sum;
}
var arr = [1,2,3];
console.log(arr.sum());//将会在控制台打印6
- 对象原型(
__proto__
)构造函数原型对象(__proto__
)都有constructor属性,指回构造函数 - 有些情况需要手动利用constructor属性指回构造函数(ES6之前未有继承时)
例如:
function Father(name,age){
this.name= name;
this.age=age;
}
function Son(name,age){
Father.call(this,name,age);//这里使用Father的构造函数,要把Father构造函数中的this改为Son的对象,这样才可以继承Father的属性并还是Son对象
}
//继承Father的方法
//这里不能采用Son.prototype=Father.prototype;因为这样赋值的是原型对象的地址值,不仅Son的原型对象会被覆盖,如果修改Son的话Father也会被修改,明显不合理,应采用:
Son.prorotype = new Father();
Son.prototype.constructor=Son;//构造函数被覆盖掉了,需要手动添加