網(wǎng)上對(duì)于prototype的文章很多,一直沒(méi)明白核心的思想。最后寫了很多例子代碼后才明白:prototype只能用在類型上。
以下是一些關(guān)于類型和對(duì)象的例子,大家看完例子后可能更容易理解類型和對(duì)象之間的聯(lián)系:
例子代碼 | 說(shuō)明 | |
1 |
Object.prototype.Property = 1; Object.prototype.Method = function () { alert(1); } var obj = new Object(); alert(obj.Property); obj.Method(); |
可以在類型上使用proptotype來(lái)為類型添加行為。這些行為只能在類型的實(shí)例上體現(xiàn)。 JS中允許的類型有Array, Boolean, Date, Enumerator, Error, Function, Number, Object, RegExp, String |
2 |
var obj = new Object(); obj.prototype.Property = 1; //Error //Error obj.prototype.Method = function() { alert(1); } |
在實(shí)例上不能使用prototype,否則發(fā)生編譯錯(cuò)誤 |
3 | Object.Property = 1; Object.Method = function() { alert(1); } alert(Object.Property); Object.Method(); | 可以為類型定義“靜態(tài)”的屬性和方法,直接在類型上調(diào)用即可 |
4 | Object.Property = 1; Object.Method = function() { alert(1); } var obj = new Object(); alert(obj.Property); //Error obj.Method(); //Error | 實(shí)例不能調(diào)用類型的靜態(tài)屬性或方法,否則發(fā)生對(duì)象未定義的錯(cuò)誤。 |
5 | function Aclass() { this.Property = 1; this.Method = function() { alert(1); } } var obj = new Aclass(); alert(obj.Property); obj.Method(); | 這個(gè)例子演示了通常的在JavaScript中定義一個(gè)類型的方法 |
6 | function Aclass() { this.Property = 1; this.Method = function() { alert(1); } } Aclass.prototype.Property2 = 2; Aclass.prototype.Method2 = function { alert(2); } var obj = new Aclass(); alert(obj.Property2); obj.Method2(); | 可以在外部使用prototype為自定義的類型添加屬性和方法。 |
7 | function Aclass() { this.Property = 1; this.Method = function() { alert(1); } } Aclass.prototype.Property = 2; Aclass.prototype.Method = function { alert(2); } var obj = new Aclass(); alert(obj.Property); obj.Method(); | 在外部不能通過(guò)prototype改變自定義類型的屬性或方法。 該例子可以看到:調(diào)用的屬性和方法仍是最初定義的結(jié)果。 |
8 | function Aclass() { this.Property = 1; this.Method = function() { alert(1); } } var obj = new Aclass(); obj.Property = 2; obj.Method = function() { alert(2); } alert(obj.Property); obj.Method(); | 可以在對(duì)象上改變屬性。(這個(gè)是肯定的) 也可以在對(duì)象上改變方法。(和普遍的面向?qū)ο蟮母拍畈煌?/TD> |
9 | function Aclass() { this.Property = 1; this.Method = function() { alert(1); } } var obj = new Aclass(); obj.Property2 = 2; obj.Method2 = function() { alert(2); } alert(obj.Property2); obj.Method2(); | 可以在對(duì)象上增加屬性或方法 |
10 | function AClass() { this.Property = 1; this.Method = function() { alert(1); } } function AClass2() { this.Property2 = 2; this.Method2 = function() { alert(2); } } AClass2.prototype = new AClass(); var obj = new AClass2(); alert(obj.Property); obj.Method(); alert(obj.Property2); obj.Method2(); | 這個(gè)例子說(shuō)明了一個(gè)類型如何從另一個(gè)類型繼承。 |
11 | function AClass() { this.Property = 1; this.Method = function() { alert(1); } } function AClass2() { this.Property2 = 2; this.Method2 = function() { alert(2); } } AClass2.prototype = new AClass(); AClass2.prototype.Property = 3; AClass2.prototype.Method = function() { alert(4); } var obj = new AClass2(); alert(obj.Property); obj.Method(); | 這個(gè)例子說(shuō)明了子類如何重寫父類的屬性或方法。 |
JavaScript能夠?qū)崿F(xiàn)的面向?qū)ο蟮奶卣饔校?BR>·公有屬性(public field)
·公有方法(public Method)
·私有屬性(private field)
·私有方法(private field)
·方法重載(method overload)
·構(gòu)造函數(shù)(constructor)
·事件(event)
·單一繼承(single inherit)
·子類重寫父類的屬性或方法(override)
·靜態(tài)屬性或方法(static member)
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com