javascript 中具有构造函数的对象
Object with constructors in javascript
好的,我有一个问题,但我不知道答案。我正在创建一个对象,该对象的属性是构造函数。现在在这些构造函数中我引用了这个。变量 this 会引用父对象吗,所以如果我在每个构造函数中创建 this.submit ,它会覆盖以前的定义吗?
我这样做的原因是因为我循环遍历对象中的每个 属性,如果它是一个函数,那么我将使用 Node 的事件发射器扩展它的原型,这样我就可以在成功后调度事件 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 = ... 在同一个父对象中设置,但它按预期工作。有人可以给我解释一下吗?
当您使用 new
调用构造函数时,一个新的空对象将作为 this
绑定到它,因此在函数内部 this
将引用新的正在创建的对象(即将从 new Link()
调用返回的内容。)这意味着在您的示例中,变量 Login
和 Logout
是不同的对象,具有不同的提交方法。
如果有人尝试在没有 new
的情况下调用 Login
,那么 this
的值将取决于调用上下文:如果调用为 Easy.Login
,则 [=11] =] 将引用 Easy
,但如果直接作为函数引用调用,则 this
的值将取决于您是否启用了严格模式。 (请参阅下面 Matt Browne 的评论)
总而言之:只要您仅将它们用作构造函数,这种方法就是正确的。但是正如您所见,不按设计调用构造函数的方式调用它们可能会出现问题,因此构造函数的名称以大写字母开头的约定(您正确遵循),所以人们不会错误地在没有 new
的情况下调用它们(大多数静态代码分析器默认情况下会警告您不遵循此约定)。
好的,我有一个问题,但我不知道答案。我正在创建一个对象,该对象的属性是构造函数。现在在这些构造函数中我引用了这个。变量 this 会引用父对象吗,所以如果我在每个构造函数中创建 this.submit ,它会覆盖以前的定义吗?
我这样做的原因是因为我循环遍历对象中的每个 属性,如果它是一个函数,那么我将使用 Node 的事件发射器扩展它的原型,这样我就可以在成功后调度事件 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 = ... 在同一个父对象中设置,但它按预期工作。有人可以给我解释一下吗?
当您使用 new
调用构造函数时,一个新的空对象将作为 this
绑定到它,因此在函数内部 this
将引用新的正在创建的对象(即将从 new Link()
调用返回的内容。)这意味着在您的示例中,变量 Login
和 Logout
是不同的对象,具有不同的提交方法。
如果有人尝试在没有 new
的情况下调用 Login
,那么 this
的值将取决于调用上下文:如果调用为 Easy.Login
,则 [=11] =] 将引用 Easy
,但如果直接作为函数引用调用,则 this
的值将取决于您是否启用了严格模式。 (请参阅下面 Matt Browne 的评论)
总而言之:只要您仅将它们用作构造函数,这种方法就是正确的。但是正如您所见,不按设计调用构造函数的方式调用它们可能会出现问题,因此构造函数的名称以大写字母开头的约定(您正确遵循),所以人们不会错误地在没有 new
的情况下调用它们(大多数静态代码分析器默认情况下会警告您不遵循此约定)。