在Javascript中声明方法的两种方法

时间:2010-11-06 19:53:52

标签: javascript

  

可能重复:
  Use of 'prototype' vs. 'this' in Javascript?

我在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!');
}

有什么区别?

3 个答案:

答案 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帖子,了解正确应用“”与“原型