我已经看到了从构造函数返回公共接口的以下样式:
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();
我不清楚这两种形式是否相同,并希望有人可以帮助我吗?
此外,对此风格的任何一般性评论都将受到赞赏..
答案 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
运算符的情况下调用它们,那么它们的行为将会非常不同。第一个将返回一个新对象,就像工厂样式方法一样,但第二个将增加全局对象,这几乎不是你想要的。