我在Javascript中看到了这两种声明方法的方法:
var User = function() {
this.name = 'Foo';
this.greet = function() {
console.log('Hello!');
}
}
和
var User = function() {
this.name = 'Foo';
}
User.prototype.greet = function() {
console.log('Hello!');
}
有什么区别?
答案 0 :(得分:3)
如果您要创建“课程”,则需要使用第二个课程。我在引号中说类,因为javascript没有类的正式概念,因为它使用原型继承。
您在JS中创建的每个对象都从原型继承其属性。在第二个示例中,您创建的每个用户都将从原型中获取方法'greet'。在第一个示例中,每个User都将从User构造函数获取方法greet。
第二种方法是优越的,因为第一种方法有效地为每个创建的对象创建了'greet'函数的新副本。在第二种方法中,每个User对象都有一个指向greet函数的指针,因此它实际上被解释器重用。请注意,这与说'greet'是静态的不同。
答案 1 :(得分:1)
在第一个示例中,您创建了User函数,然后将greet函数添加到该实例(给User.greet())。但是因为你在构造函数中有这个,所以它将被添加到所有实例中。
在第二个示例中,您定义了User构造函数。然后为所有用户实例定义greet原型。这与你在这里的第一个例子相同,但如果形成不同,那么变化就会变得更加明显
var User = function() {
this.name = 'Foo';
}
var a=new User();
var b=new User();
a.greet=function(){
alert(this.name);
}
/*a has the greet function, b does not*/
User.prototype.greet=function(){
alert(this.name);
}
/*a and b both have the greet function now, since they are both of class User*/
答案 2 :(得分:0)
您可能希望查看this帖子,了解正确应用“此”与“原型”