2013-02-15 82 views
1

是否有可能爲以下結合JAVASCRIPT原型風格

function something() {} 
function somethingElse() {} 

somethingElse.prototype = new something(); 
somethingElse.prototype.someFunction = function() {} 
... 

與此

somethingElse.prototype = { 
    someFunction: function() {}, 
    ... 
} 

結合起來,保持原型的繼承鏈

這純粹是化妝品我猜。我只想定義{}內的所有功能,而不是使用大量的...原型... = ...

我已經看到了很多其中的任何一個,但從未將它們彙集在一起​​。

+0

你試過了嗎? – Shmiddty 2013-02-15 21:02:24

+0

我嘗試了各種事情,比如設置__proto__之後等。__proto__非常時髦。 – 0xFADE 2013-02-15 22:30:14

回答

1

我個人最喜歡的方法是抓住underscore.js庫。它有一個非常好的方法,稱爲擴展來將屬性粘貼到對象上。所以,我可以這樣做:

function something() {} 
function somethingElse() {} 

somethingElse.prototype = new something(); 

_.extend(somethingElse.prototype, { 
    someFunction: function() { }, 
    someOtherFunction: function() { } 
}); 
+0

我必須去與此。這不是我真正想要的解決方案,但確實如此。看下劃線來源,它幾乎就是複製你傳入的所有對象,所以它聽起來相當緩慢。 – 0xFADE 2013-02-18 15:15:36

0

區別在於,在第二個版本中,somethingElse實例不會繼承something及其原型鏈中的任何內容。考慮到你的代碼示例,這並沒有什麼區別。

+2

'instanceof'很重要。 – Shmiddty 2013-02-15 21:05:52

+0

這就是整個觀點。第二部分不能得到任何繼承鏈的行動。克里斯的延伸將完成這項工作。我希望有一些不需要包含的東西。 – 0xFADE 2013-02-15 22:44:52

+0

@ 0xFADE顯然我錯過了你的「並保持原型繼承鏈」的句子... – bfavaretto 2013-02-15 22:54:54

0

嗯,它們確實是完全一樣的。

foo = {} 
foo.bar = baz 

相同

foo = { 
    bar: baz 
} 

這是口味的問題。

順便說一句:用大寫字母來命名構造函數(任何要用new調用的東西)被認爲是更好的風格,以區分它與常規函數,因爲混淆它們可能會造成非常糟糕的結果。

0

您可以使用Object.defineProperties,但它實際上是更冗長,而且沒有在傳統瀏覽器的支持:

Object.defineProperties(somethingElse.prototype,{ 
    someOtherFunction: { 
     value:function() {...} 
    }, 
    ... 
}); 

或者,你可以添加一個基本的extend方法到對象的原型:

Object.prototype.extend = function(obj){ 
    for(var p in obj)this[p] = obj[p]; 
}; 

這將允許你這樣做:

somethingElse.prototype.extend({ 
    A:function(){'a'}, 
    B:function(){'b'} 
}); 

我通常會建議不要這樣做,因爲修改原生對象的原型可能會變得危險。

+0

謝謝。我想知道是否有可能。而不是所有這些來複制對象是否有一種方法可以在生成原型時準確地設置原型。() } – 0xFADE 2013-02-18 15:21:23