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