为什么建议在构造函数中包含方法? - Javascript

时间:2014-01-20 06:02:55

标签: javascript function methods constructor

我目前正在阅读一本关于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.以这种方式宣布它是否有任何好处或是最佳做法?

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() {
  ...
};

所有这些方法都是有效的,但最后一种方法是最常用的,并且在第一种方法上具有最佳性能。第二个是大部分时间都不方便。