av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

Javascript中的Trait與代碼重用

我們知道,OOP中最普遍的代碼重用方式是通過繼承,但是,繼承有一些缺點(diǎn),其中最為主要的是繼承是一種isa關(guān)系,父子類之間的關(guān)系太過緊密,而對于像JAVA這門語言而言,只能支持單繼承,使得很多時(shí)候不能不進(jìn)行代碼拷貝這樣的事情。

10余年的扎蘭屯網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整扎蘭屯建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“扎蘭屯網(wǎng)站設(shè)計(jì)”,“扎蘭屯網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

舉個(gè)例子,假設(shè)我們要建模動(dòng)物。最底層是一個(gè)Animal對象,下面有貓科,犬科。然后貓科下有貓,老虎。犬科下有狗和狼。 貓能夠miao,狗能夠叫,老虎和狼都能夠狩獵,這個(gè)時(shí)候問題來了,由于狩獵這個(gè)特性是老虎和狼都有的,但是老虎以及從貓科繼承,狼已經(jīng)從犬科繼承,它們都已經(jīng)無法通過繼承來獲得狩獵這個(gè)能力了。

讓我們來看看Trait如何來解決這個(gè)問題。 Trait從表面上看和一個(gè)類很類似,有屬性和方法,但是它必須依附于一個(gè)類才能起作用。同時(shí)多個(gè)Traits可以組合成一個(gè)Trait。如果不同的 Traits中屬性或者方法有沖突的話,可以選擇重命名屬性的方法來決議沖突。如果沖突沒有決議的話,組合Traits會(huì)拋出異常。

這樣,類層次仍然像前面描述的一樣,我們把狩獵定義為一個(gè)Trait,然后在構(gòu)建老虎和狼的類的時(shí)候把Trait融入進(jìn)去。這樣老虎和狼就獲得了狩獵的能力了。

由于Java語言的限制,沒有一種華麗的方法來實(shí)現(xiàn)Trait。讓我們來看看基于原型的Javascript語言如何實(shí)現(xiàn)Trait。這個(gè)其實(shí)從一 個(gè)側(cè)面證明基于原型的Javascript和基于類的Java相比,對于OOP而言更加靈活和強(qiáng)大。為了縮減代碼的大小,這里我使用light- traits這個(gè)JS庫。因?yàn)橥暾麑?shí)現(xiàn)一個(gè)Traits庫超出這篇文章的范圍。

 
 
 
  1. var util = require('util'); 
  2. var Trait = require('light-traits').Trait; 
  3. var expect = require('chai').expect; 
  4. var _ = require('lodash'); 
  5. function inherits(constructor, parentConstructor, trait, properties) { 
  6.   util.inherits(constructor, parentConstructor); 
  7.   if (properties !== undefined) 
  8.     _.extend(constructor.prototype, properties); 
  9.   if (trait !== undefined) 
  10.     constructor.prototype = trait.create(constructor.prototype); 
  11.  
  12. function Animal() {} 
  13. Animal.prototype = { 
  14.   isAlive: true, 
  15.   eat: function (food) { 
  16.     console.log("omnomnom, I'm eating: " + food); 
  17.   }, 
  18.   sleep: function () { 
  19.     console.log('zzzz'); 
  20.   }, 
  21.   die: function () { 
  22.     this.isAlive = false; 
  23.     console.log("I'm dead"); 
  24.   } 
  25. }; 
  26.  
  27. function CatFamily() {} 
  28. inherits(CatFamily, Animal); 
  29. function DogFamily() {} 
  30. inherits(DogFamily, Animal); 
  31.  
  32. var TMeow = Trait({ 
  33.   meow: function () { 
  34.     console.log('meow meow'); 
  35.   } 
  36. }); 
  37. function Cat() {} 
  38. inherits(Cat, CatFamily, TMeow); 
  39.  
  40. var cat = new Cat(); 
  41. cat.meow(); 
  42.  
  43. var TBark = Trait({ 
  44.   bark: function () { 
  45.     console.log('woof woof'); 
  46.   } 
  47. }); 
  48. function Dog() {} 
  49. inherits(Dog, DogFamily, TBark); 
  50.  
  51. var dog = new Dog(); 
  52. dog.bark(); 
  53.  
  54.  
  55. var THunt = Trait({ 
  56.   huntCount: 0, 
  57.   hunt: function () { 
  58.     console.log('looking for food', this.huntCount++, 'times'); 
  59.  
  60.   }, 
  61.   kill: function (animal) { 
  62.     animal.die(); 
  63.     console.log('I killed animal'); 
  64.   } 
  65. }); 
  66.  
  67. function Tiger() {} 
  68. inherits(Tiger, CatFamily, THunt, { 
  69.   roar: function () { 
  70.     console.log("roar...roar..."); 
  71.   } 
  72. }); 
  73.  
  74. var tiger = new Tiger(); 
  75. expect(tiger).to.be.instanceOf(CatFamily); 
  76. expect(tiger).to.have.property('hunt'); 
  77. expect(tiger).to.have.property('kill'); 
  78. expect(tiger).to.not.have.property('meow'); 
  79. expect(tiger.isAlive).to.be.equal(true); 
  80. tiger.hunt(); 
  81. tiger.eat('meat'); 
  82. tiger.roar(); 
  83.  
  84. function Wolf() {} 
  85. inherits(Wolf, DogFamily, Trait.compose(TBark, THunt)); 
  86.  
  87. var wolf = new Wolf(); 
  88. expect(wolf).to.be.instanceOf(DogFamily); 
  89. expect(wolf).to.have.property('hunt'); 
  90. expect(wolf).to.have.property('kill'); 
  91. expect(wolf).to.have.property('bark'); 
  92. expect(wolf.isAlive).to.be.equal(true); 
  93. wolf.bark(); 
  94. wolf.hunt(); 
  95. wolf.hunt(); 
  96. wolf.sleep(); 
  97. wolf.kill(cat); 
  98. expect(cat.isAlive).to.be.equal(false); 
  99. expect(wolf.huntCount).to.be.equal(2); 

網(wǎng)頁題目:Javascript中的Trait與代碼重用
網(wǎng)頁網(wǎng)址:http://uogjgqi.cn/article/cdshhog.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們在微信上24小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流