2010-05-17 85 views
6

我看了John Resig的Best Practices in JavaScript Library Design介紹;一張幻燈片建議「調整」對象構造函數,以便它自己實例化。在構造函數中包裝是好還是壞?

function jQuery(str, con) { 
    if (window === this) { 
     return new jQuery(str, con); 
    } 
    // ... 
} 

因此,new jQuery("#foo")變成jQuery("#foo")

我認爲這很有趣,但我沒有在我自己的代碼中寫過這樣的構造函數。

稍後我在SO上讀了一篇文章。 (對不起,我不記得是哪一個或我提供了一個鏈接,如果我能再次找到它,我會更新這個問題。)其中一個評論說,這樣做是不好的做法,從程序員那裏隱藏new,但是沒有沒有詳細說明。

我的問題是,它通常被認爲是好的,壞的或無所謂的,爲什麼?

回答

5

這是當人們忘記防守技術在「班級」功能前使用new操作員。
邏輯是,如果調用函數時沒有使用new,那麼全局作用域仍然是當前作用域(而不是新實例),因此我們只需使用new運算符調用相同的函數。

但是,如果你問我,正確的做法是拋出一個錯誤,實際上讓開發人員知道它犯了一個錯誤,而不是「接受」它。

但是,嘿,我猜它根據jQuery的口頭禪:
「而不是讓用戶能夠寫出高質量的代碼,啓用/強迫他們寫不合邏輯的和無效的代碼」。

1

您正在從函數返回一個對象。我覺得沒有問題。

這是一樣的做:

function getObject(){ return new SomeObject; } 

唯一的區別是,你實際上是返回自己。但是,如果你清楚地記錄它,這看起來並不具有誤導性。習慣jQuery的人可能會讚揚你提高可用性。

4

國際海事組織我認爲這是一個實用且完全有效的防禦技術

如果你正在建設一個constructor function,肯定要使用新創建的對象實例(this)和沒什麼好會發生,如果this指向全局對象。

在未來

幸運的是,在嚴格模式 ECMAScript的5版,this將只包含undefined當一個函數被調用,沒有基本對象,也不是new操作...

參見: