有關js模式的重要回答

來源:互聯網
上載者:User

標籤: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”來代表一種類型,

比如:

1 function Person(){};

我們可以認為,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模式的重要回答

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.