我想實現多級繼承,支持實現的多態性在擴展對象上執行的擴展方法(不是通過外部實用工具或函數 - 從角度來看的對象被擴展)。javascript中的多級多態性Object.extend
TL;博士的jsfiddle這裏:http://jsfiddle.net/arzo/VLkF7/
我想要什麼?
var MyObj = {name: 'object', toString: function() {return this.name;}};
MyObj.extend = function(objectToBeMerged) {
var objs=[this, objectToBeMerged],
newobj={},
obj;
for(var i in objs) {
for(var k in (obj=objs[i])) if (obj.hasOwnProperty(k)) newobj[k]=obj[k];
}
return newobj;
}
console.assert(MyObj.extend, 'ERROR: this should pass');
var ActionObj = MyObj.extend({name: 'action abstract object', exec: 'implemtation', undo: 'implementation of opposite action here'});
var DragNDrop = ActionObj.extend({name: 'drag&drop action', exec: function(){console.log('did d&d');}})
//unfortunately following assert will not get through, because MyObj.extend cannot iterate over ActionObj properties
if(DragNDrop.toString) console.info('MyObj.extend iterated over MyObj\'s properties')
console.assert(DragNDrop.undo, 'but MyObj.extend did not iterate over ActionObj properties, undo action is missing in this object:', DragNDrop)
;
上面的代碼有什麼問題?如果這是常規的,例如C++繼承,然後DragNDrop將具有撤消方法,但它沒有,因爲VAR的OBJ = [此,objectToBeMerged]評估該只MyObj中,但我想有它評價爲任何物體在其上延伸執行(因此在執行ActionObj.extend的情況下,我想有關鍵字此在功能延伸評估以ActionObj,不MyObj中)
解決這一問題,可以使用_.exten jQuery.extend的d,看起來像:
//add here code in previous quote in this post...
MyUtils = {}
MyUtils.extend = function(objectToBeMerged, parent) {
var objs=[parent || this, objectToBeMerged],
newobj={},
obj;
for(var i in objs) {
for(var k in (obj=objs[i])) if (obj.hasOwnProperty(k)) newobj[k]=obj[k];
}
return newobj;
}
console.assert(MyObj && ActionObj, 'are you sure you have added code from previous block?');
var DnDAction=MyUtils.extend({name: 'drag&drop action', exec: function(){console.log('did d&d');}},ActionObj);
if (DnDAction.undo) console.info('using MyUtils.extend works fine and .undo is defined as expected in', DnDAction)
;
但上述解決方案需要使用外部工具 - 在這種情況下,這是不是真的多態的解決方案MyUtils
。
你有什麼想法如何強制MyObj.extend迭代運行時評估(不是何時定義評估)this
表達式?