資源描述:
《淺談javascript中原型(prototype)、構造函數(shù)、對象實例及三者之間的關系》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、淺談javascript中原型(prototype)、構造函數(shù)、對象實例及三者之間的關系??一下內容是本人的學習之余為了增強記憶做的筆記,理解上或者有些膚淺,望高手莫笑;同時,既然是筆記,就難免有錯誤,若給各位造成誤解還望海涵,也希望多多指教,謝謝!?首先說一下javascript中prototype的作用;該對象的用途是包含一種類型的所有實例都能共享的一些屬性和方法,即如果為一個類型的prototype對象定義了一些屬性,則該類型的所有實例都能訪問到這些屬性。請看下面例子:functionPerson(name,sex){
this.name=name;
this.sex=sex;
}
2、
Person.prototype.sayHello=function(){
alert("Hello,Iam"+this.name);
}???定義一個Person對象,該對象有兩個屬性name和sex,為該對象的prototype屬性定義一個sayHello方法;下面我們可以new兩個Person的實例:varperson1=newPerson("Andy","man");
varperson2=newPerson("Jacky","man");???現(xiàn)在,person1和person2都可以調用sayHello方法,因為sayHello方法屬于Person的原型對象,而該對象的所有
3、屬性對于Person的所有實例都是公用的。調用sayHello:person1.sayHello();//Hello,IamAndy.
person2.sayHello();//Hello,IamJacky.?js完全可以用另外一種方式給一個對象定義方法:functionPerson(name,sex){
this.name=name;
this.sex=sex;
this.sayHello=function(){
alert("Hello,Iam"+this.name);
}
}??但是這種方式明顯有一個問題,就是當我創(chuàng)建N個Person實例的時候會創(chuàng)建N個sayHello方法,而且這
4、些方法功能相同!這很明顯不合理,而用原型就能很好的避免這個問題,所以prototype的優(yōu)越性也就體現(xiàn)出來了!同樣用prototype還可以在js中實現(xiàn)繼承。??用prototype實現(xiàn)繼承:?首先我定義一個Animal對象,然后讓Person繼承Animal.?定義Animal對象:functionAnimal(){}
Animal.prototype.canDo(){
alert("吃飯,睡覺……");
}?讓Person對象繼承Animal:?Person.prototype=newAnimal();現(xiàn)在Person對象的實例就可以訪問Animal的方法了:person1.canD
5、o();//吃飯、睡覺……?javascript中的構造函數(shù):?javascript中并沒有提供一些像C#那樣創(chuàng)建類的特殊語法。創(chuàng)建構造函數(shù)也和普通的函數(shù)并沒有什么不同,只是寫法上有些特定的規(guī)則(首字母大寫)。如果用new關鍵字調用該函數(shù),則也就創(chuàng)建了個新實例,該函數(shù)會被當做構造函數(shù)調用。如果當成一般的函數(shù)調用,會出現(xiàn)一些值得注意的現(xiàn)象,請看下面的代碼:Person("Mrzhang","man");
alert(window.name);//Mrzhang很明顯,如果這樣調用一個構造函數(shù),則該函數(shù)的參數(shù)將被賦予window對象,也就是全局變量。?下面說一下原型、構造函數(shù)和對象實例三者之
6、間的關系。??當你創(chuàng)建一個對象的時候,也就同時也創(chuàng)建了一個該對象的prototype對象,也就是說prototype是構造函數(shù)的一個屬性。而在prototype對象里同樣有一個屬性:constructor,該對象指向構造函數(shù)(沒有通過prototype實現(xiàn)繼承的情況下),例如:alert(Person.prototype.constructor);Person對象的每個實例(person1、person2)都有一個_proto_屬性,該屬性指向構造函數(shù)的prototype對象。可以用isprototypeof(該方法用來測試原型是否存在于一個對象的實例中,是則返回true,否則返回fal
7、se)進行測試:Person.prototype.isPrototypeOf(person1);//true