试图理解javascript中的对象和方法创建

时间:2013-10-16 18:16:22

标签: javascript oop object

我正在尝试理解在javascript中创建对象和方法的不同方法。我已经阅读了很多文章,博客和stackoverflow问题,我想我总的来说这个概念。但是我遇到了一个小的javascript库(用coffeescript编写),它创建对象和方法的方式让我感到困惑。

我已添加了一个代码段,但如果您愿意,可以在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;
    
  4. 由于这是在coffeescript中创建对象和方法的首选方法,我认为这是更好的方法之一。但它优于以下版本的优势让我感到惊讶:

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

1 个答案:

答案 0 :(得分:3)

  1. 是;这使得所有以前的顶级var成为局部变量。

  2. 它使this等于函数

  3. 中的全局对象
  4. 它可以作为CommonJS module(适用于Node.js或Browserify)