2014-08-27 32 views
1

我讀了一章關於observershere並沒有這對於Subject實體實現接口下面的代碼:爲什麼混入選擇了原型繼承

function Subject(){...} 
Subject.prototype.addObserver = function(observer){...}; 
Subject.prototype.removeObserver = function(observer){...}; 
Subject.prototype.notify = function(context){...}; 

然後是擴展功能產生的混入:

function extend(extension, obj){ 
    for (var key in extension){ 
    obj[key] = extension[key]; 
    } 
} 

和下面的代碼創建具體的研究對象是一個複選框:

var controlCheckbox = document.getElementById("mainCheckbox"); 

// Extend the controlling checkbox with the Subject class 
extend(new Subject(), controlCheckbox); 

這裏我的問題是爲什麼controlCheckbox混合,而不是繼承Subject類?

+3

因爲他們只想儀器那個特定的複選框? – 2014-08-27 15:12:08

+3

您無法真正改變DOM元素的原型鏈。 – 2014-08-27 15:15:13

+0

這不是'controlCheckbox'被混入'new Subject()' - 這是相反的。 'controlCheckbox'(蹩腳的名字,順便說一句)正在獲得與「Subject」相關的行爲。 – cHao 2014-08-27 15:25:57

回答

4

我在這裏的問題是爲什麼controlCheckbox混合,而不是繼承自Subject類?

因爲controlCheckBoxHTMLInputElement一個實例,我們不能讓(不希望)從任意類繼承。

將接口(Subject)混合到DOM元素或甚至DOM類is questionable anyway中,創建包裝器對象(new Subject(document.getElementById("mainCheckbox")))可能是一個更好的主意。