標籤:des io ar 使用 sp java for div on
Function.prototype.method = function (name, func) {//在Function的原型上增加一個函數叫做“method”。該方法會在“類”的原型上增加指定函數名的函數。 if (!this.prototype[name]) { this.prototype[name] = func; }}; Object.method(‘superior‘, function (name) {//增加一個超級方法。該方法儲存它從原型上繼承來方法。用來類比物件導向中的super關鍵字。 var that = this, method = that[name]; return function ( ) { return method.apply(that, arguments); };});var mammal = function (spec) {//定義一個哺乳動物類型。 var that = {}; that.get_name = function ( ) {//擷取動物名字。 return spec.name; }; that.says = function ( ) {//動物打招呼的方法。 return spec.saying || ‘‘; }; return that;};//var myMammal = mammal({name: ‘Herb‘});//建立一個哺乳動物的執行個體。var cat = function (spec) {//定義一個“貓”的類型。 spec.saying = spec.saying || ‘meow‘;//為這個類型指定一個“叫聲”,這裡是“喵” var that = mammal(spec);//建立一個哺乳動物執行個體。 that.purr = function (n) {//為這個哺乳動物建立一個貓的咕嚕咕嚕聲音的方法“purr” var i, s = ‘‘; for (i = 0; i < n; i += 1) { if (s) { s += ‘-‘; } s += ‘r‘; } return s; }; that.get_name = function ( ) {//擷取“貓”的名字。貓的叫聲(meow) + 貓的名字 + 貓的叫聲(meow) return that.says( ) + ‘ ‘ + spec.name + ‘ ‘ + that.says( ); } return that;};var myCat = cat({name: ‘Henrietta‘});//建立一隻貓的執行個體。名字叫Henriettavar coolcat = function (spec) {//建立一個“酷貓”的類型 var that = cat(spec),//建立一隻普通貓。 super_get_name = that.superior(‘get_name‘);//儲存普通貓的“擷取名字”的方法。 that.get_name = function (n) {//酷貓有自己的“擷取名字”的方法,“like” + 普通貓的“擷取名字方法” + “baby” return ‘like ‘ + super_get_name( ) + ‘ baby‘; }; return that;}; var myCoolCat = coolcat({name: ‘Bix‘});//建立一隻酷貓。var name = myCoolCat.get_name( );//酷貓的名字是like meow Bix meow baby// ‘like meow Bix meow baby‘ |
上面採用prototype(原型擴充)的方式來實現“類”的繼承,如,酷貓 > 繼承 > 貓 > 繼承 > 哺乳動物。
而下面採用了另外一種思路:使用原廠模式來建立對象,不是通過複用原型。而是拆分零組件。每個組件都是可拆卸,可組裝的方式,來達到另一種代碼複用的效果。
| 12345678910111213141516171819202122232425262728293031323334 |
function createCar(numberOfDoors){//造車廠,指定門的數量,並製造一輛汽車。 var numberOfWheels = 4;//輪子的數量是4. function describe(){//描述一下車輛。 return "I have " + numberOfWheels + " wheels and " + numberOfDoors + " doors."; } return {//返回製造完成的汽車。 describe: describe };}function createOdometer(){//加工車載裡程計。 var mileage = 0; function increment(numberOfMiles){ mileage += numberOfMiles;}//裡程計跑表的方法 function report(){ return mileage; }//報告當前的裡程數 return {//返回製造完成的裡程計 increment: increment, report: report }} function createCarWithOdometer(numberOfDoors){//製造帶有裡程計的汽車 var odometer = createOdometer();//製造一個裡程計 var car = createCar(numberOfDoors);//製造一輛車 car.drive = function(numberOfMiles){//將裡程計安裝到汽車上,當汽車行駛的過程中,調用裡程計的跑表方法。 odometer.increment(numberOfMiles); } car.mileage = function(){//報告汽車的裡程,通過已安裝的裡程計的報告方法,擷取裡程。 return "car has driven " + odometer.report() + " miles"; } return car;//返回製造並組裝完畢的汽車。} var twoFn=createCarWithOdometer(100);//創造一輛帶有100個門的汽車(當然不可能。。Σ( ° △ °|||)︴) console.log(twoFn); |
上述兩種方式,體現了javascript的精妙之處。
在物件導向語言中:
採用了類繼承的方式,實現代碼複用。
在javascript中,並沒有真正的類。而是用“function”來代表一種類型,
比如:
我們可以認為,Person就是所謂的javascript中的“類”的概念。我們可以這樣
| 123 |
var p = new Person();alert(p instanceof Person);//結果是true,因為p就是Person類型的一個執行個體。alert(p instanceof Object);//結果也是true,因為所有執行個體終歸都是Object。 |
而每個類型是如果擴充自己的新方法的呢?就是通過類型的prototype這個屬性。
只有function才有prototype屬性。
比如:
| 123456 |
function Person(){}Person.prototype.say = function(){alert(‘hello‘);};//人這種類型有打招呼的方法var p1 = new Person();var p2 = new Person();p1.say();//hellop2.say();//hello |
這樣,所有執行個體就都可以用打招呼的方法了。
當我們建立一個新的類型“男人”。想要繼承Person的話。就像下面這樣:
| 1234567891011 |
function Man(){} var proto = Man.prototype = new Person();//男人也是人啊,男人的原型就是以一個普通人為標準來參考的,所以我們建立一個人類,賦值給男人,讓男人來學習,參考人的特性。 proto.fight = function(){//男人比起人來,脾氣大,因此有個打架的方法。 alert(‘I\‘ll kick your ass!!‘);} var m = new Man();m.say();//hellom.fight();//I‘ll kick your ass.這就是傳說中的一句話說不上來就開打。。。 |
原型繼承的核心就是這樣的。
而另外一種思路就是原廠模式。
小汽車廠
輪子廠
裡程計廠
卡車廠
小汽車廠需要輪子和裡程計,分別向“輪子廠”和“裡程計廠”要來了兩個現成的產品,直接安裝好,就完成了一輛小汽車。
卡車長也是一樣的。所以這種方式也是一種很好的代碼結構。
有關js模式的重要回答