关于Javascript中的对象声明的问题

时间:2011-01-12 11:01:34

标签: javascript oop

这有什么区别:

function Book() {
    this.title = '';

    this.setTitle = function(title) {
        this.title = title;
    }
}

或者这个:

function Book() {
}
Book.prototype.title = '';
Book.prototype.setTitle = function(title) {
    this.title = title;
}

除了语法之外还有什么区别吗?

4 个答案:

答案 0 :(得分:3)

您应该阅读prototypes

在第一个示例中,您在创建的setTitle实例上设置了函数Book

在第二个示例中,您使用的是原型继承,换句话说,所有Books现在都继承了相同的setTitle函数。

第二个节省内存,所有Book个实例的功能更容易“更新”。

但是第一个有用例,因为你可以省略标题this并通过closures使变量变为私有。

function Book(title) {
    var title = title;

    this.getTitle = function() { // function keeps a reference to title
        return title; // now we only have a getter, but no setter for title
                      // thus title is essentially private
    }
}

答案 1 :(得分:2)

使用Book.prototype.setTitle时,只创建一个setTitle函数,并将其重新用于Book的所有未来实例。

在第一个例子中,Book的每个实例都将创建每个自己的setTitle函数。

因此,建议使用原型。

答案 2 :(得分:0)

第一个将直接在Book的实例上设置title属性和setTitle方法。第二个将这些成员设置在Book的原型上。第二种方法通常是OOP JavaScript的更好方法。

答案 3 :(得分:0)

昨天这个优秀的SO问题将解释你的两个例子之间的差异:Why is JavaScript prototyping?