javascript
浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系
轉(zhuǎn)自:http://www.cnblogs.com/zhangwei412827/archive/2012/12/14/2816263.html
淺談javascript中原型(prototype)、構(gòu)造函數(shù)、對象實例及三者之間的關(guān)系
? ?一下內(nèi)容是本人的學(xué)習(xí)之余為了增強記憶做的筆記,理解上或者有些膚淺,望高手莫笑;同時,既然是筆記,就難免有錯誤,若給各位造成誤解還望海涵,也希望多多指教,謝謝!
? 首先說一下javascript中prototype的作用;該對象的用途是包含一種類型的所有實例都能共享的一些屬性和方法,即如果為一個類型的prototype對象定義了一些屬性,則該類型的所有實例都能訪問到這些屬性。請看下面例子:
function Person(name,sex){ this.name=name; this.sex=sex; } Person.prototype.sayHello=function(){ alert("Hello,I am "+this.name); }?
? ?定義一個Person對象,該對象有兩個屬性name和sex,為該對象的prototype屬性定義一個sayHello方法;下面我們可以new兩個Person的實例:
var person1=new Person("Andy","man"); var person2=new Person("Jacky","man");?
? ?現(xiàn)在,person1和person2都可以調(diào)用sayHello方法,因為sayHello方法屬于Person的原型對象,而該對象的所有屬性對于Person的所有實例都是公用的。調(diào)用sayHello:
person1.sayHello();//Hello,I am Andy. person2.sayHello();//Hello,I am Jacky.? js完全可以用另外一種方式給一個對象定義方法:
function Person(name,sex){ this.name=name; this.sex=sex; this.sayHello=function(){ alert("Hello,I am "+this.name); } }? ?但是這種方式明顯有一個問題,就是當(dāng)我創(chuàng)建N個Person實例的時候會創(chuàng)建N個sayHello方法,而且這些方法功能相同!這很明顯不合理,而用原型就能很好的避免這個問題,所以prototype的優(yōu)越性也就體現(xiàn)出來了!同樣用prototype還可以在js中實現(xiàn)繼承。
??用prototype實現(xiàn)繼承:
? 首先我定義一個Animal對象,然后讓Person繼承Animal.
? 定義Animal對象:
function Animal(){} Animal.prototype.canDo(){ alert("吃飯,睡覺……"); }?讓Person對象繼承Animal:
?
Person.prototype=new Animal();現(xiàn)在Person對象的實例就可以訪問Animal的方法了:
person1.canDo();//吃飯、睡覺……? javascript中的構(gòu)造函數(shù):
? javascript中并沒有提供一些像C#那樣創(chuàng)建類的特殊語法。創(chuàng)建構(gòu)造函數(shù)也和普通的函數(shù)并沒有什么不同,只是寫法上有些特定的規(guī)則(首字母大寫)。
如果用new關(guān)鍵字調(diào)用該函數(shù),則也就創(chuàng)建了個新實例,該函數(shù)會被當(dāng)做構(gòu)造函數(shù)調(diào)用。如果當(dāng)成一般的函數(shù)調(diào)用,會出現(xiàn)一些值得注意的現(xiàn)象,請看下面的代碼:
Person("Mr zhang","man"); alert(window.name);//Mr zhang很明顯,如果這樣調(diào)用一個構(gòu)造函數(shù),則該函數(shù)的參數(shù)將被賦予window對象,也就是全局變量。
?下面說一下原型、構(gòu)造函數(shù)和對象實例三者之間的關(guān)系。
? ?當(dāng)你創(chuàng)建一個對象的時候,也就同時也創(chuàng)建了一個該對象的prototype對象,也就是說prototype是構(gòu)造函數(shù)的一個屬性。而在prototype對象里同樣有一個屬性:constructor,該對象指向構(gòu)造函數(shù)(沒有通過prototype實現(xiàn)繼承的情況下),例如:
alert(Person.prototype.constructor);Person對象的每個實例(person1、person2)都有一個_proto_屬性,該屬性指向構(gòu)造函數(shù)的prototype對象。可以用isprototypeof(該方法用來測試原型是否存在于一個對象的實例中,是則返回true,否則返回false)進行測試:
Person.prototype.isPrototypeOf(person1);//true轉(zhuǎn)載于:https://www.cnblogs.com/jiangdd/archive/2012/12/17/2822176.html
總結(jié)
以上是生活随笔為你收集整理的浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快e付累计限额不足是什么意思
- 下一篇: javascript对于DOM加强