实例化的对象拥有独立的一套属性和方法,举例如下:
function Person(name){
this. name=name;
this. getName=function(){
return this. name;
}
}
var p1=new Person("tom");
var p2=new Person("alice");
实例化的对象p1和p2拥有各自的name属性和getName方法,尽管这两个方法实现的功能一致。
function Person(name){
this. name=name;
}
Person.prototype. getName=function(){
return this. name;
}
var p3=new Person("tom");
var p4=new Person("alice");
把getName方法定义到Person. prototype原型上,p3和p4拥有各自的属性name,同时共享相同的getName方法。
同样的,若把属性定义到原型上,如Person. prototype. count=520; 则所有实例化的Person对象都可以访问人类数量,若新增一个实例修改count为521,所有的实例访问count时都显示521。
访问一个对象的属性和方法时,系统会沿着原型链去寻找,先在对象的数据结构中找,若没有找到就到其原型对象中找,若还没找到,就到其原型对象的上一层原型对象去找,这就是继承。如图,Person原型对象的__proto__指向它的父类Object的原型对象。
于是修改一个类Person原型对象的上一层原型对象为另外一个类Living原型对象,就实现了Person继承Living的目的。
Person. prototype.__proto__=Living. prototype;
如果Person原型对象中没有属性和方法,则直接将Person的原型对象改成Living的原型对象,也是可以的。
Person. prototype=Living. prototype;
同时更正原型对象的构造函数指向Person. prototype. constructor=Person;
这样Living就成为Person的父类,也就是说Person继承了Living。
网友评论