我正在尝试理解在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);
我很难理解以下内容:
为什么作者更喜欢用(function(){...}).call(this);
包装所有内容?也许是为了避免创建全局变量?
脚本最末端的.call(this)
部分用于什么目的?
为什么作者创建root
变量以及以下行是什么?
root = typeof exports !== "undefined" && exports !== null ? exports : window;
root.Instafeed = Instafeed;
由于这是在coffeescript中创建对象和方法的首选方法,我认为这是更好的方法之一。但它优于以下版本的优势让我感到惊讶:
function Instafeed(params) {
...
}
Instafeed.prototype.run = function() {
...
}
答案 0 :(得分:3)
是;这使得所有以前的顶级var
成为局部变量。
它使this
等于函数
它可以作为CommonJS module(适用于Node.js或Browserify)