2012-06-12 104 views
0

我想要做的是這樣的:的Javascript功能轉換聲明爲功能字典原型

我的基本代碼:

var Obj = function() { 
    this.do = function() {}; 
    this.stop = function() {}; 
    this.kill = function() {}; 
}; 

Obj.prototype.load = function() {}; 

需要的轉換:

var ConvObject = function() { }; 
ConvObject.prototype = (typeof Obj == "function")? new Obj : Obj; 

這示例作品(用於轉換部分)。在ConvObject中,Obj的所有方法都在那裏。但在我的情況下,我不想執行Obj的默認構造函數。我寧願避免這一點。的確,我不想執行新的Obj。

我試過不同的方法來完成這個。這裏是最好的答案我可以現在發現:

var getSizeOf = function(obj) { 
    var size = 0, key; 
    for (key in obj) { 
    if (obj.hasOwnProperty(key)) size++; 
    } 
    return size; 
}; 

var ConvObject = function() { }; 
if ((typeof Obj == "function") && getSizeOf(Obj.prototype) == 0) { 
    ConvObject.prototype = new Obj; 
} 
else { 
    ConvObject.prototype = (typeof Obj == "function")? Obj.prototype : Obj; 
} 

這工作時的OBJ看起來是這樣的:

var Obj = new function() {}; 
Obj.prototype.do = function() {}; 
Obj.prototype.stop = function() {}; 
Obj.prototype.kill = function() {}; 
Obj.prototype.load = function() {}; 

或者,如果它看起來像這樣:

var Obj = function() { 
    this.do = function() {}; 
    this.stop = function() {}; 
    this.kill = function() {}; 
    this.load = function() {}; 
}; 

但是,這解決方案失敗時,我有上面的基本代碼。我怎樣才能避免這個調用默認的構造函數? 感謝您的幫助!

+1

是的,但他不想調用構造函數。由於在這種情況下構造函數的代碼是將屬性添加到對象的唯一方法,因此只能通過調用構造函數來獲取它們。 – Pointy

+0

你是對的。我必須調用構造函數才能擁有這些功能。謝謝你的回答! – Jeep87c

回答

1

使用Object.create()(或其polyfill)從Obj.prototype直接繼承。

要從Obj構造「繼承」的實例方法,你應該把它在每一個ConvObjectVery simple Javascript inheritance。無論如何,當這些方法是特定於實例的時候,您都需要這樣做,否則它們應該放在原型上。

+0

的確,這個解決方案避免了對構造函數的調用。感謝您的回答,但是,Pointy讓我意識到我想要的是不可能的。 – Jeep87c

+0

哦,還有一個解決方案。正如Pointy所說,當然你需要調用構造函數。 – Bergi