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

ajs*_*sie 6 javascript

可能重复:
在Javascript中使用'prototype'与'this'?

我在Javascript中看到了这两种声明方法的方法:

var User = function() {
    this.name = 'Foo';
    this.greet = function() {
        console.log('Hello!');
    }
}
Run Code Online (Sandbox Code Playgroud)

var User = function() {
    this.name = 'Foo';
}

User.prototype.greet = function() {
    console.log('Hello!');
}
Run Code Online (Sandbox Code Playgroud)

有什么区别?

hvg*_*des 3

如果您要创建一个“类”,则需要使用第二个。我说类用引号引起来是因为 javascript 没有类的正式概念,因为它使用原型继承。

您在 JS 中创建的每个对象都会从原型继承其属性。在第二个示例中,您创建的每个用户都将从原型中获取方法“greet”。在第一个示例中,每个 User 都会从 User 构造函数中获取greet方法。

第二种方法更优越,因为第一种方法有效地为创建的每个对象创建了“greet”函数的新副本。在第二种方法中,每个 User 对象都有一个指向greet 函数的指针,因此它实际上被解释器重用。请注意,这与说“问候”是静态的不同。