@guoxs
2015-07-07T23:31:36.000000Z
字数 1775
阅读 3708
JavaScript
构造器的一个属性:prototype
其值就是原型
无论是自定义的还是原生的构造器都有prototype属性
function Teacher(){
this.course = [];
}
Teacher.prototype = {
job:‘teacher’;
setName: function(name){
this.name = name;
};
addCourse: function(course){
this.course.push(course);
}
}
对应的原型关系为:
JS中对象之间的关系是通过原型继承去实现的,原型继承的层级构成原型链
对于上面的JS代码,有如下原型链:
_proto_:隐式指针
prototype:原型属性
Teacher对象可通过new function创建,故其有function的原型属性;也可以通过构造器创建,故也有prototype属性,该属性有指向Teacher.prototype,Teacher.prototype又继承至Object对象。
原型链的查找、修改、删除
属性查找:先在自身查找,如果找不到则顺着原型链查找
tom.name; //tom,自身属性
tom.job; //teacher, Teacher.prototype属性
tom.toString; //查找至Object.prototype中的<build-ins>内置属性
属性修改:在JS中修改属性只能修改自身的属性
tom.name = 'Tom Green'; //修改了tom的name值
tom.job = 'assistant'; //先在tom对象中创建job属性,然后修改值为assistant
//修改原型上的属性
Teacher.prototype.job = 'assistant'; //修改了原型上的属性,但是用这个构造器创建出来的对象该值都会改变。也就是说bill的job值也会变成assistant,而不是teacher。
属性删除:使用delete在JS中删除属性只能修改自身的属性,无法删除原型上的属性
delete tom.job; //删除tom自身对象的job
tom.job; //返回teacher,原型上的属性
delete tom.job; //不会有任何变化
tom.job; //返回teacher
tom.hasOwnProterty('job');
如果返回true,则属于本身
ES5中的原型继承:目前大多主流浏览器都支持,只有IE低版本浏览器不支持
Obiect.create(proto[,protertiesObject]);
//直接从原型对象创建新对象,不需要像之前的:指定构造器的prototype,将构造器的prototype指向原型对象时,会通过构造器创建很多对象,这个时候创建对象都是要通过构造器来完成的,要new一个constructor来完成。
Obiect.create(proto[,protertiesObject]); 传入两个参数,第一个参数是指定创建对象的原型对象,第二个参数可以为定义出来的对象创建一些属性和方法。
例子:
var teacher = {
job: 'teacher';
courses: [];
setName: function(course){
this.name = name;
}
addCourse: function(course){
this.courses.push(course);
}
}
var bill = Object.create(teacher); //原型对象是teacher,不需要使用构造器,new teacher()这种方式
bill.setName('Bill'); //添加name属性把值设为bill。
bill.addCourse('math'); //改变了teacher中的courses值
bill隐式指针会指向teacher对象
使用构造器
参考:
低版本浏览器中实现Object.cteate功能
How does JavaScript .prototype work?