【发布时间】:2011-01-17 11:55:52
【问题描述】:
我的同事一直在使用带有小写“f”的“new function()”来定义 JavaScript 中的新对象。它似乎在所有主流浏览器中都运行良好,而且在隐藏私有变量方面似乎也相当有效。这是一个例子:
var someObj = new function () {
var inner = 'some value';
this.foo = 'blah';
this.get_inner = function () {
return inner;
};
this.set_inner = function (s) {
inner = s;
};
};
一旦使用“this”,它就成为 someObj 的公共属性。所以 someObj.foo、someObj.get_inner() 和 someObj.set_inner() 都是公开可用的。此外,set_inner() 和 get_inner() 是特权方法,因此它们可以通过闭包访问“inner”。
但是,我在任何地方都没有看到任何关于这种技术的参考。甚至 Douglas Crockford 的 JSLint 也抱怨它:
- 奇怪的结构。删除“新”
我们正在生产中使用这种技术,它似乎运行良好,但我有点担心它,因为它没有在任何地方记录。有谁知道这是否是一种有效的技术?
【问题讨论】:
-
我更喜欢你的构造而不是 IIFE('立即调用函数')。 1:您不需要显式的“实例”对象,这正是 JavaScript 中的“this”。 2:您不需要退回任何东西,这意味着您不需要记住。甚至接受答案的作者最初也忘记返回实例对象!如果人们讨厌 new 和 this,他们通常更喜欢使用 IIFE,这是有充分理由的 - 如果你有一个处理 DOM 事件的函数,
this将引用触发事件的元素,而不是你的对象,但你可以有var instance = this代替。 -
为什么指定“小写 f”对这个问题很重要?
-
因为在Javascript中也存在'Function'函数(大写F),不同的是:Function是构造函数,可以创建新的函数对象,而function 是一个关键字。
-
@Bergi 我读了你的链接。我认为没有理由抹黑这种模式。这是有效的。这很简单。那么有什么问题。 JSLint 抱怨一切顺便说一句:)
标签: javascript function object instantiation