3

我想實現多級繼承,支持實現的多態性在擴展對象上執行的擴展方法(不是通過外部實用工具或函數 - 從角度來看的對象被擴展)。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表達式?

回答

0

我找到了解決方案,立足underscode和骨幹人士(尤其是骨幹網擴展應用到每一個類的方法)

var obj = { 
    name: 'hi', 
    getKeys: function() { 
    var o=[]; 
    try{ 
     o=Array.prototype.slice.apply(this,0); //in case browser's engine is fckd up .... 
    } catch (e) { //implementation feature of conerting to an array 
     for(var i in this) o.push(i); 
    } 
    var _this=this; 
    return o.map(function(i,e){return _this[i];}); 
    }, 
}; 

var obj2 = { 
    __proto__: obj, 
    extension: 'impl.', 
    name: 'great hi' 
}; 

var obj3 = { 
    __proto__: obj2, 
    extension: 'impl2.', 
    name: 'greater hi' 
}; 

console.assert(obj.getKeys().length!=obj2.getKeys().length, 'something went wrong, they are not equal'); 
console.log(obj.getKeys(), obj2.getKeys(), obj3.getKeys()); 

正如你所看到的,評估本作預計在polymoprhism作品! 這可以通過使用Backbone.extend功能