2012-03-14 62 views
3
var Editor = {}; 

Editor.Basic = function(obj) { 
    this.config ={ 
     value: obj 
    } 
}; 

Editor.Basic.prototype = { 
    getValue: function() { 
     return this.config.value; 
    } 
}; 

Editor.Advanced = function(obj) { 
    Editor.Basic.call(this, obj); 
}; 

Editor.Advanced.prototype = { 
    config: { 
     notValue: !this.config.value 
    } 
}; 

var extendByPrototype = function(obj1, obj2) { 
    for (var key in obj2.prototype) { 
     if (obj2.prototype.hasOwnProperty(key) && obj1.prototype[key] === undefined) 
      obj1.prototype[key] = obj2.prototype[key]; 
    } 
}; 

extendByPrototype(Editor.Advanced, Editor.Basic); 

反正是有得到Editor.Advanced.prototype擴展現有對象(遞歸的過程),而不是重寫他們的? (如extendByPrototype所示)原型繼承和擴展現有的對象

我知道我會檢查obj1.prototype[key] !== undefined,但我不能確定什麼,我需要做的,在一個通用的方式擴展現有的按鍵,而從Editor.Advanced.prototype移動config的構造和使用push功能。

+0

你想深入的擴展,jQuery有一個(平庸)算法 – Raynos 2012-03-14 17:50:32

+0

堅持..小心檢查我的理解了一下。你問是否有辦法讓一個Class對象擴展一個實例對象?就像你如何設置Editor.Advanced.prototype = {...}? – 2012-03-14 21:29:06

回答

-1

在JavaScript中擴展對象的正確方法是使用Object.create(prototype)。以這種方式創建的對象將具有適當的繼承設置。要獲得任何物體的原型,您將使用Object.getPrototypeOf(object)

Object.create(prototype)是JavaScript 1.8.5中的新功能。如果您正在尋找向後兼容,你必須使用非標準的方式

function extend(child, supertype) { 
    child.prototype.__proto__ = supertype.prototype; 
} 

extend(Animal, Lifeform); 
extend(Plant, Lifeform); 

var anOnion = new Plant(); 

之後,你可以通過...

object.contructor.__proto__ 

更多細節上的原型對象__proto__這裏:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/proto

+0

不解決問題 – Raynos 2012-03-14 19:23:02

+0

沒有人不應該使用此示例作爲參考 – mate64 2015-05-18 22:36:41