實(shí)例化的對(duì)象擁有獨(dú)立的一套屬性和方法,舉例如下:
function Person(name){
? ? ? ? this. name=name;
? ? ? ? this. getName=function(){
? ? ? ? ? ? ? ? return this. name;
? ? ? ? }
}
var p1=new Person("tom");
var p2=new Person("alice");
實(shí)例化的對(duì)象p1和p2擁有各自的name屬性和getName方法,盡管這兩個(gè)方法實(shí)現(xiàn)的功能一致。
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,同時(shí)共享相同的getName方法。
同樣的,若把屬性定義到原型上,如Person. prototype. count=520; 則所有實(shí)例化的Person對(duì)象都可以訪問人類數(shù)量,若新增一個(gè)實(shí)例修改count為521,所有的實(shí)例訪問count時(shí)都顯示521。
訪問一個(gè)對(duì)象的屬性和方法時(shí),系統(tǒng)會(huì)沿著原型鏈去尋找,先在對(duì)象的數(shù)據(jù)結(jié)構(gòu)中找,若沒有找到就到其原型對(duì)象中找,若還沒找到,就到其原型對(duì)象的上一層原型對(duì)象去找,這就是繼承。如圖,Person原型對(duì)象的__proto__指向它的父類Object的原型對(duì)象。
于是修改一個(gè)類Person原型對(duì)象的上一層原型對(duì)象為另外一個(gè)類Living原型對(duì)象,就實(shí)現(xiàn)了Person繼承Living的目的。
Person. prototype.__proto__=Living. prototype;
如果Person原型對(duì)象中沒有屬性和方法,則直接將Person的原型對(duì)象改成Living的原型對(duì)象,也是可以的。
Person. prototype=Living. prototype;
同時(shí)更正原型對(duì)象的構(gòu)造函數(shù)指向Person. prototype. constructor=Person;
這樣Living就成為Person的父類,也就是說(shuō)Person繼承了Living。