2013-04-06 17 views
0

我正在看一些代碼,只是爲了確保我沒有失去我的想法,因爲這看起來像我這樣的明顯,沒有什麼獲得。看起來像$ .extend()的浪費用法,但也許有人可以闡明一些我可能遺漏的遺留問題。當你擴展()一個obj原型與自己時獲得了什麼

所以,我們有這個。

_letsCreateNameSpace('US.somenew.obj'); 
//this is based on S.stoyanov namespace pattern, what this _letsCreateNameSpace does. 

然後我在一些代碼中看到了這一點,它對我沒有意義。

US.somenew.obj = function(){ 
    // some this var assignments. 
    this.blah = $foo; 
} 

// this usage of extend escapes me. I don't see a need at this point here. 
$.extend(US.somenew.obj.prototype, { 
    // a bunch of new methods 


} 

我不使用在$ .extend(所有利益看),而不是隻以下,因爲是有的,但本身並沒有任何擴展。

US.somenew.obj.prototype = { 
    // a bunch of new methods 
} 

沒有'深'擴展或任何東西..只是看起來像一個無緣無故擴展原型的詳細方式。

我錯過了什麼嗎?在這裏我缺少一些「樹背後的森林」方法嗎?

回答

1

我認爲唯一的好處是保持原始原型對象完好,而不是用新對象覆蓋它。
constructor屬性將引用正確的功能(US.somenew.obj)而不是指Object。當然,你可以正確地重新指定.prototype.constructor(這經常完成),但是可以通過擴展現有對象來避免這種情況。

從一種編碼風格點的觀點似乎是有道理的還有:通常你不想更換原型,要屬性添加到它。

+0

我看 - 這是有道理的和事我想過,但我想通了原來的用法是對象的「新實例」但用明確的名稱空間聲明是不可能的。嗯。好的,我認爲代碼將是多實例的,但似乎並非如此。好的,謝謝你的回答。 – 2013-04-06 01:15:11

3

$.extend將複製到prototype不給出方法覆蓋prototype對象本身。因此,舉例來說,如果您有:

// inheritance 
US.somenew.obj.prototype = myproto; 

US.somenew.obj.prototype = { 
    // you lost the inheritance with `myproto`, here 
} 

使用$.extend將阻止。另外,你不會失去一些默認屬性。例如,constructor

US.somenew.obj = function() {}; 

US.somenew.obj.prototype = {}; 

var o = new US.somenew.obj(); 

console.log(o.constructor === US.somenew.obj) // false, in that case is `Object` 

其中:

US.somenew.obj = function() {}; 

$.extend(US.somenew.obj.prototype, {}); 

var o = new US.somenew.obj(); 

console.log(o.constructor === US.somenew.obj) // true 
+0

真棒解釋。現在它完全有道理。我看到了它的需要。謝謝。 – 2013-04-06 01:17:16