我认为您将 JavaScript 模块模式与 JavaScript 构造函数混淆了。
JavaScript 构造函数
如果您编写一个函数并new
在其前面使用关键字调用它,则该函数被称为构造函数。
它将自动返回一个新对象,您可以使用this
关键字在构造函数中引用该对象。
var Test = function() {
var that = this;
this.something = function () {
console.info(that);
console.info(this);
};
}
var test1 = new Test();
test1.something();
您可以改为返回自己的对象,但通常不会在构造函数中这样做,您只需使用this
:
var Test = function() {
var that = this;
return {
something: function () {
console.info(that);
console.info(this);
}
};
}
var test1 = new Test();
test1.something();
如果你不new
使用它前面的关键字调用它,那么它就像一个普通函数一样被调用,这意味着this
对它内部的任何引用都指的是该函数是其属性的对象(在没有其他任何东西的情况下, 将是全局对象,在 Web 浏览器中是window
)。
var geoff = {
Test: function () {
var that = this;
return {
something: function () {
console.info(that);
}
};
}
};
var test2 = geoff.Test();
var test3 = Test();
注意:对于构造函数,您通常会在其原型对象上定义方法,这样就不会为您使用构造函数创建的每个对象不必要地重新定义方法:
var Test = function() {
this.else = "Something Else"
}
Test.prototype.something = function () {
console.info(this);
}
Test.prototype.somethingElse = function () {
console.info(this.else);
}
var test4 = new Test();
test1.somethingElse() // Logs "Something Else"
(请注意,如果您如上所述从构造函数返回您自己的对象,那么您将无法再访问原型对象上的方法。)
另请注意,每次调用构造函数时,它都会返回一个新对象。您可以将参数传递给构造函数(就像您可以使用任何其他函数一样)并使用它们来自定义返回的对象:
var Test = function(else) {
this.else = else;
}
Test.prototype.somethingElse = function () {
console.info(this.else);
}
var test1 = new Test("Something else");
var test2 = new Test("Something else again");
test1.somethingElse(); // Logs "Something else"
test2.somethingElse(); // Logs "Something else again"