我正试图围绕组织我的代码。我的项目中有几个模块,我想组织这些模块。
关键是我想到的一切都没有成功。我目前正在考虑四个想法:
简单对象 - 由于范围问题而无效。使用this.a
会有效,但this
具有不同的含义,具体取决于谁调用它,因此它不可靠。例如,我曾经为WebSocket
类分配了一个函数,但是当this
事件调用该函数时,突然WebSocket
引用WebSocket
实例。我每次调用函数时都可以使用bind(foo)
,但我必须有另一种方法。
var foo = {
a: 3,
s: function() {
alert(a); // a doesn't exist in this scope
alert(this.a); // 'this' isn't always foo
alert(foo.a); // I would have to put 'foo.' before each variable
// reference, but I'm sure that's not the way to do it
}
};
实例 - a
未定义。同样,this
不可靠。
var foo = function() {
this.a = 3;
this.s = function() {
alert(a);
};
};
var foo_instance = new foo();
foo_instance.a = 4;
foo_instance.s(); // Error: a is not defined
关闭实例 - 不返回任何内容;它保持undefined
。
var foo = (function() {
this.a = 3;
this.s = function() {
alert(a);
};
})();
// foo === undefined
使用getter / setter关闭 - 在Chrome上运行得很漂亮,但IE不支持getter / setter。
var foo = (function() {
var a = 3;
return {
get a() { return a; },
set a(v) { a = v; },
s: function() {
alert(a); // Doesn't work in IE as getters/setters are
// not supported
}
};
})();
我如何有效地组织我的模块,以便我可以安全地以跨浏览器的方式访问属性?
感谢。
答案 0 :(得分:2)
3未定义,因为您没有返回任何内容。而不是将属性和方法分配给'this',试试这个:
var foo = (function() {
var self = {};
self.someProperty = someValue;
self.someFunction = function () {
}
return self;
}());
foo现在将返回一个定义了属性和方法的对象。这样做你永远不会想知道“这个”实际上指的是什么。
答案 1 :(得分:1)
在我看来,您并没有真正理解this
和闭包在JavaScript中是如何工作的。
请阅读both个these主题,并查看namespaces。
有很多不同的方法可以实现模块,但除非你理解基础知识,否则在这里谈论它没有多大意义,所以请参阅我的链接以获得深入的解释。
答案 2 :(得分:1)
您的第一个代码段使用了一个闭包,并对应于yui library受欢迎的模式。第二种模式对应于对象的私有,公共和特权成员的概念。
我建议您阅读Douglas Crockford关于javascript private members的这篇主要文章,并选择第一个选项或第二个选项。 它们在语义上等同于。
(与前两个相比,第三段和第四段片段看起来过于复杂)