Javascript中简单对象中的奇怪构造?

4

http://jsbin.com/ufihev/3/edit

这是非常简单的代码:

var t = new function () //line 1
    {
        this.a1 = function () {

            return function () {
                alert("1");
            };
        }();
        this.a2 = function () {
            alert("a2");
        };

    }; //line 16
t.a1();

但是jsBin下面的红线告诉我:

第1行:var t = new function () --- 奇怪的构造方式。删除 'new'。

第16行:}; --- 缺少调用构造函数的 '()'。

代码运行正常。 我做错了什么?

在我的Firefox/Chrome上运行良好。你遇到了哪个浏览器的问题? - Abdul Munim
@Munim,jsBin下面有一条红线.....我已经编辑了,请查看链接。谢谢。 - Royi Namir
@Hristo 你是怎么找到这个的? :) 谢谢,我会看一下的。 - Royi Namir
@Hristo 我仍然不明白为什么我的代码是不好的......我已经阅读了链接答案,解决方案是创建一个内部实例来自动执行包装函数...那也没问题..但我想知道为什么我的代码不好。 - Royi Namir
@Royi... 我通过简单的谷歌搜索找到了它。这里还有另一个链接http://stackoverflow.com/questions/6440193/constructing-object-with-new-function-vs-invoking-function-with-function... 但我无法确切地告诉你为什么它不好。我并不是说它好或不好,只是new function() {}似乎不是常见的做法。此外,如果jsBin使用jsLint,而jsLint是由Douglas Crockford编写的,并且它告诉你不要那样做,那么我会听从,因为Douglas Crockford是JavaScript大师。 - Hristo
显示剩余3条评论
2个回答

2
如果你要编写一个类似于“匿名类型”的东西,例如:
var _anonymous_type = function () {
    ...
}

var t = new _anonymous_type();

你应该:
var t = new (function () {
    ...
})();

看到代码的区别了吗? :)

1
第二个只是第一个的内联,为什么会被认为是错误的? - ripper234
@Jeffrey Zhao,我使用你的新建议时也收到了相同的警告(无恶意)。 - Sapphire_Brick

1

试试这个:

var t = function () //line 1
    {
        this.a1 = function () {

            return function () {
                alert("1");
            };
        }();
        this.a2 = function () {
            alert("a2");
        };

    }; //line 16

var x = new t();
x.a1();

1
我也可以做到那个......但我的代码语法没问题。我看不出为什么它不起作用.... - Royi Namir
从技术上讲,var t = new function()...没有任何问题,但没有充分的理由去这样做。因此出现了奇怪的构造函数。 - regality

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接