好吧我有一个问题,我不知道答案。我正在创建一个对象,该对象的属性是构造函数。现在在这些构造函数中我引用了这个。这个变量是否会引用父对象,所以如果我在每个构造函数中创建this.submit,它是否会覆盖先前的定义?
我这样做的原因是因为我循环遍历对象中的每个属性,如果它是一个函数,那么我使用Node的Event Emitter扩展其原型,这样我就可以在成功调用ajax之后调度事件。
以下是一个例子:
var AccountMethods = function(apiVersion){
return {
/** Used to login users
*
* @param username - {string} Username
* @param password - {string} Password
* @function
*
* @example
* var Login = new Easy.Login('fakeusername', 'fakepassword')
* Login
* .on('done', function(data){
* if(data.success){
* // user is logged in
* } else{
* throw new Error(data.error);
* }
* })
* .on('error', function(err){
* // do something with err
* });
*/
Login: function (username, password) {
this.submit = function () {
$.post(apiVersion + 'account/login', {
username: username,
password: password
})
.done(function (data) {
if(data.success){
this.emit('done', data);
} else{
this.emit('error', data)
}
}.bind(this))
.fail(function (err) {
this.emit('error', {
error: err.status + ' ' + err.statusText + ' : ' + err.responseText
});
}.bind(this));
}
},
/** Used to logout users
*
* @function
*
* @example
* var Logout = new Easy.Logout();
*
* Logout.on('done', function(){
* // user is logged out
* });
*
* Logout.submit();
*/
Logout: function () {
this.submit = function () {
$.post(apiVersion + 'account/logout')
.done(function (data) {
this.emit('done');
}.bind(this))
.fail(function (err) {
this.emit('error', err);
}.bind(this));
}
},
}
}
您可以在评论示例中看到用法。这肯定按照我想要的方式工作,但是不是吗?
我可以这样做,它按预期工作:
var Login = new Easy.Login('fakeusername', 'fakepassword');
Login.submit();
var Logout = new Easy.Logout();
Logout.submit();
两个提交函数都使用this.submit = ...在同一个父对象中设置,但它按预期工作。有人可以向我解释一下吗?
答案 0 :(得分:2)
当您使用new
调用构造函数时,一个新的空对象被绑定到this
,因此函数this
内部将引用新的正在创建的对象(即从new Link()
调用返回的内容。)这意味着在您的示例中,变量Login
和Logout
是不同的对象,具有不同的提交方法。 / p>
如果有人尝试在没有Login
的情况下拨打new
,则this
的值将取决于调用上下文:如果调用Easy.Login
,则this
会引用Easy
,但如果直接调用函数引用,那么this
的值将取决于您是否启用了严格模式。 (见Matt Browne的评论)
总而言之:只要您只将它们用作构造函数,这种方法是正确的。但正如你所看到的那样,没有调用构造函数,因为它们被设计为被调用可能是有问题的,因此构造函数的惯例是'名称以大写字母开头(你正确地遵循),所以人们不会错误地在没有new
的情况下调用它们(大多数静态代码分析器会默认警告你不遵守这个惯例。)