2012-03-14 61 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