0

我已经看到了以下从构造函数返回公共接口的样式:

function AnObjectConstructor() {

    function localFunc() {};
    function publicFunc() {};

    // public interface
    var _this = {
        publicFunc: publicFunc
    };
    return _this;
};

我喜欢这种风格,因为公共接口显然在一个地方,而且 localFunc 可以在不使用 _this 的情况下访问 publicFunc

这段代码也可以这样写:

function AnObjectConstructor() {

    function localFunc() {};
    function publicFunc() {};

    // public interface
    var _this = this;
    _this.publicFunc = publicFunc;
    return _this;
};

这两种形式都旨在与 new 一起使用:

var obj = new AnObjectConstructor();
obj.publicFunc();

我不清楚这两种形式是否相同,希望有人能帮助我吗?

也将不胜感激对这种风格的任何一般性评论。

4

3 回答 3

4

这两个片段没有做同样的事情。虽然两个片段都有对第一个片段的公共引用,publicFunc但它返回一个对象字面量,第二个片段是对函数的引用。这两个例子都不是你将如何创建函数构造函数的例子。您需要使用new关键字来实例化对象的实例:

function AnObjectConstructor() {
    function localFunc() {};
    function publicFunc() {};
    // public interface
    this.publicFunc = publicFunc;
    //You don't need this line :return _this;
};

var obj = new AnObjectConstructor();

我还删除了 的创建,_this因为没有理由创建局部变量并分配this给它。

编辑

在我看来,第二种方法更受欢迎,因为它是更传统的方法,它利用了 JavaScript 内置的构造对象能力。第一种方法没有抓住重点,因为它只是一个返回精简对象字面量的函数。

于 2013-07-23T01:51:54.953 回答
1

它们是有区别的。您的第一个构造函数可以通过两种方式调用:

var myObject = AnObjectConstructor();

或者

var myObject = new AnObjectConstructor();

这是因为第一个构造函数手动创建了返回的对象。在new操作员的情况下,this当您返回自己的手工对象时,引擎自动创建的对象被有效地丢弃。

但是,您的第二个构造函数依赖于您使用new运算符调用它。如果不使用new,它会污染当前this可能是另一个对象或全局空间。

于 2013-07-23T01:59:57.510 回答
0

当与new运算符一起使用时,它们确实是相同的(至少就它们当前的定义而言),正如规范所说,this在执行构造函数时设置为新构造的对象,或者如果返回一个对象(您的第一个示例),将其用作构造对象。返回您自己的对象时的不同之处在于它不会[[prototype]]设置为AnObjectConstructor.prototype.

此外,如果您在没有new操作员的情况下调用它们,那么它们的行为将非常不同。第一个将返回一个新对象,很像工厂风格的方法,但第二个将增加全局对象,这几乎不是您想要的。

于 2013-07-23T01:49:04.013 回答