我目前正在阅读一本关于Javascript的书,作者建议在构造函数中声明方法,而不是将它们放在构造函数之外。 (我不是指“PROTOTYPE”关键字)
推荐方法
function User(uname,password){
this.uname=uname;
this.password=password
this.displayUser=function(){ // inside the constructor
document.write(this.uname+this.password);
};
}
替代方法
function user(uname,password){
this.uname=uname;
this.password=password;
}
function displayUser(){ // outside the constructor
document.write(this.uname+this.password);
}
有人可以解释我为什么作者推荐方法1.以这种方式宣布它是否有任何好处或是最佳做法?
答案 0 :(得分:3)
在第一个代码中,您有一个带有两个属性(uname,password)和一个方法(displayUser)的构造函数。 this
是指使用new
关键字创建实例时的实例:
var user = new User('Joe', 'abc123');
user.displayUser();
在第二个代码中,您的构造函数具有两个属性,但没有方法。通过将displayUser
创建为普通函数而不绑定到this
,您的实例和方法之间会断开连接,您无法再调用user.displayUser()
。但是在JavaScript中,一切都是动态的,如果您明确地传递了上下文,可以调用displayUser
:
var user = new User('Joe', 'abc123');
displayUser.call(user); // `this` is `user`
另一种常见的方法是将方法添加到原型中,而不是添加到每个新实例,它在实例之间共享:
function User(uname,password){
this.uname = uname;
this.password = password;
}
User.prototype.displayUser = function() {
...
};
所有这些方法都是有效的,但最后一种方法是最常用的,并且在第一种方法上具有最佳性能。第二个是大部分时间都不方便。