2013-10-16 59 views
2

我想了解在javascript中創建對象和方法的不同方法。我讀過很多文章,博客和stackoverflow的問題,我想我總體上理解了這個概念。但是我遇到了一個小型的JavaScript庫(用coffeescript編寫),它創建對象和方法的方式讓我感到困惑。試圖瞭解在javascript中創建對象和方法

我已經包含一個片段,但如果你想要的話,你可以在instafeed.js找到完整的腳本。

代碼:

(function() { 
    var Instafeed, root; 

    Instafeed = (function() { 

     function Instafeed(params) { 
      var option, value; 
      this.options = { 
       target: 'instafeed', 
       get: 'popular', 
       resolution: 'thumbnail', 
       sortBy: 'most-recent', 
       links: true, 
       limit: 15, 
       mock: false 
      }; 
      if (typeof params === 'object') { 
       for (option in params) { 
        value = params[option]; 
        this.options[option] = value; 
       } 
      } 
     } 

     Instafeed.prototype.run = function() { 
      var header, instanceName, script; 
      if (typeof this.options.clientId !== 'string') { 
       if (typeof this.options.accessToken !== 'string') { 
        throw new Error("Missing clientId or accessToken."); 
       } 
      } 
      if (typeof this.options.accessToken !== 'string') { 
       if (typeof this.options.clientId !== 'string') { 
        throw new Error("Missing clientId or accessToken."); 
       } 
      } 
      if ((this.options.before != null) && typeof this.options.before === 'function') { 
       this.options.before.call(this); 
      } 
      if (typeof document !== "undefined" && document !== null) { 
       script = document.createElement('script'); 
       script.id = 'instafeed-fetcher'; 
       script.src = this._buildUrl(); 
       header = document.getElementsByTagName('head'); 
       header[0].appendChild(script); 
       instanceName = "instafeedCache" + this.unique; 
       window[instanceName] = new Instafeed(this.options); 
       window[instanceName].unique = this.unique; 
      } 
      return true; 
     } 

    ... 

     return Instafeed; 

    })(); 

    root = typeof exports !== "undefined" && exports !== null ? exports : window; 

    root.Instafeed = Instafeed; 

}).call(this); 

我有理解困難以下幾點:

  1. 爲什麼筆者喜歡用(function(){...}).call(this);包裹的一切嗎?也許爲了避免創建全局變量?

  2. 腳本最後端的.call(this)部分有什麼用途?

  3. 爲什麼作者創建了root變量,以下是哪些內容?

    root = typeof exports !== "undefined" && exports !== null ? exports : window; 
    root.Instafeed = Instafeed; 
    

由於這個首選的方法在CoffeeScript中創建對象和方法,我想這是的更好的方法來做到這一點的。但它的優點在接下來的版本逃脫我:

function Instafeed(params) { 
    ... 
} 
Instafeed.prototype.run = function() { 
    ... 
} 

回答

3
  1. 是;這使以前的頂級var成爲局部變量。

  2. 它使this等於函數

  3. 它允許它作爲一個CommonJS module工作(使用Node.js語言或Browserify)

+0

感謝您的快速響應裏面的全局對象。你對最後一部分有什麼意見嗎? (優於常見的方式...) – monroo

+0

@monroo:其中的差異的優勢? – SLaks