我們就把這種形式稱為“甘露模型”吧!其實,這種“甘露模型”的原型用法才是符合prototype概念的本意,才是的JavaScript原型的真諦! ...
今天跟朋友討論JS的面向對象編程問題,想起了原來曾經看過一篇文章,但是看過很久想不起來了,用了很多關鍵詞,終於用“悟透JavaScript 面向對象”這兩個關鍵詞找到了原文,原文地址:http://www.cnblogs.com/zhangshiwen/p/3627085.html
為防止以後難以看到這樣好的文章,特將原文中最有價值的“原型甘露”一段內容貼出來。
//語法甘露: var object = //定義小寫的object基本類,用於實現最基礎的方法等 { isA: function(aType) //一個判斷類與類之間以及對象與類之間關係的基礎方法 { var self = this; while(self) { if (self == aType) return true; self = self.Type; }; return false; } }; function Class(aBaseClass, aClassDefine) //創建類的函數,用於聲明類及繼承關係 { function class_() //創建類的臨時函數殼 { this.Type = aBaseClass; //我們給每一個類約定一個Type屬性,引用其繼承的類 for(var member in aClassDefine) this[member] = aClassDefine[member]; //複製類的全部定義到當前創建的類 }; class_.prototype = aBaseClass; return new class_(); }; function New(aClass, aParams) //創建對象的函數,用於任意類的對象創建 { function new_() //創建對象的臨時函數殼 { this.Type = aClass; //我們也給每一個對象約定一個Type屬性,據此可以訪問到對象所屬的類 if (aClass.Create) aClass.Create.apply(this, aParams); //我們約定所有類的構造函數都叫Create,這和DELPHI比較相似 }; new_.prototype = aClass; return new new_(); }; //語法甘露的應用效果: var Person = Class(object, //派生至object基本類 { Create: function(name, age) { this.name = name; this.age = age; }, SayHello: function() { alert("Hello, I'm " + this.name + ", " + this.age + " years old."); } }); var Employee = Class(Person, //派生至Person類,是不是和一般對象語言很相似? { Create: function(name, age, salary) { Person.Create.call(this, name, age); //調用基類的構造函數 this.salary = salary; }, ShowMeTheMoney: function() { alert(this.name + " $" + this.salary); } }); var BillGates = New(Person, ["Bill Gates", 53]); var SteveJobs = New(Employee, ["Steve Jobs", 53, 1234]); BillGates.SayHello(); SteveJobs.SayHello(); SteveJobs.ShowMeTheMoney(); var LittleBill = New(BillGates.Type, ["Little Bill", 6]); //根據BillGate的類型創建LittleBill LittleBill.SayHello(); alert(BillGates.isA(Person)); //true alert(BillGates.isA(Employee)); //false alert(SteveJobs.isA(Person)); //true alert(Person.isA(Employee)); //false alert(Employee.isA(Person)); //true
“語法甘露”不用太多,只要那麼一點點,就能改觀整個代碼的易讀性和流暢性,從而讓代碼顯得更優雅。有了這些語法甘露,JavaScript就很像一般對象語言了,寫起代碼了感覺也就爽多了!
令人高興的是,受這些甘露滋養的JavaScript程式效率會更高。因為其原型對象里既沒有了毫無用處的那些對象級的成員,而且還不存在 constructor屬性體,少了與構造函數間的牽連,但依舊保持了方法的共用性。這讓JavaScript在追溯原型鏈和搜索屬性及方法時,少費許多 工夫啊。
我們就把這種形式稱為“甘露模型”吧!其實,這種“甘露模型”的原型用法才是符合prototype概念的本意,才是的JavaScript原型的真諦!
想必微軟那些設計AJAX架構的工程師看到這個甘露模型時,肯定後悔沒有早點把AJAX部門從美國搬到咱中國的觀音廟來,錯過了觀音菩薩的點化。 當然,我們也只能是在代碼的示例中,把Bill Gates當作對象玩玩,真要讓他放棄上帝轉而皈依我佛肯定是不容易的,機緣未到啊!如果哪天你在微軟新出的AJAX類庫中看到這種甘露模型,那才是真正 的緣分!