从JavaScript构造函数返回公共接口

时间:2013-07-23 01:43:36

标签: javascript

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

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;
};

这两种形式都适用于新的:

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

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

此外,对此风格的任何一般性评论都将受到赞赏..

3 个答案:

答案 0 :(得分: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构建对象的内置功能的更传统的方法。第一种方法忽略了这一点,因为它只是一个返回精简对象文字的函数。

答案 1 :(得分:1)

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

var myObject = AnObjectConstructor();

var myObject = new AnObjectConstructor();

这是因为第一个构造函数手动创建了返回的对象。对于new运算符,当您返回自己的手工对象时,引擎自动创建的this对象将被有效丢弃。

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

答案 2 :(得分:0)

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

此外,如果您在没有new运算符的情况下调用它们,那么它们的行为将会非常不同。第一个将返回一个新对象,就像工厂样式方法一样,但第二个将增加全局对象,这几乎不是你想要的。