首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >原型与闭包的面向对象的javascript

原型与闭包的面向对象的javascript
EN

Stack Overflow用户
提问于 2010-08-25 16:56:40
回答 3查看 27.3K关注 0票数 65

我很好奇下面这几种面向对象的javascript技术有什么不同。他们似乎最终做了同样的事情,但其中一种被认为比另一种更好吗?

代码语言:javascript
复制
function Book(title) {
    this.title = title;
}

Book.prototype.getTitle = function () {
    return this.title;
};

var myBook = new Book('War and Peace');
alert(myBook.getTitle())

vs

代码语言:javascript
复制
function Book(title) {
    var book = {
        title: title
    };
    book.getTitle = function () {
        return this.title;
    };
    return book;
}

var myBook = Book('War and Peace');
alert(myBook.getTitle())
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-25 17:02:56

第二个并不是真正创建一个实例,它只是返回一个对象。这意味着你不能利用像instanceof这样的运算符。例如:在第一种情况下,您可以执行if (myBook instanceof Book)来检查变量是否为Book类型,而在第二种情况下,这将失败。

如果你想在构造函数中指定你的对象方法,这是正确的方法:

代码语言:javascript
复制
function Book(title) {
    this.title = title;

    this.getTitle = function () {
        return this.title;
    };
}

var myBook = new Book('War and Peace');
alert(myBook.getTitle())

虽然在本例中两者的行为方式完全相同,但也存在差异。使用基于闭包的实现,您可以拥有私有变量和方法(只是不要在this对象中公开它们)。因此,您可以执行以下操作:

代码语言:javascript
复制
function Book(title) {
    var title_;

    this.getTitle = function() {
        return title_;
    };

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

    // should use the setter in case it does something else than just assign
    this.setTitle(title);
}

Book函数之外的代码不能直接访问成员变量,它们必须使用访问器。

另一个很大的区别是性能;基于原型的类化通常要快得多,这是由于使用闭包中包含了一些开销。您可以在本文中阅读有关性能差异的信息:http://blogs.msdn.com/b/kristoffer/archive/2007/02/13/javascript-prototype-versus-closure-execution-speed.aspx

票数 46
EN

Stack Overflow用户

发布于 2010-08-25 17:03:32

前一种方法是如何使用JavaScript的。后者是一种更现代的技术,部分是由道格拉斯·克罗克福德推广的。这种技术要灵活得多。

您还可以执行以下操作:

代码语言:javascript
复制
function Book(title) {
    return {
        getTitle: function () {
            return title;
        }
    }
}

返回的对象将只有一个名为getTitle的访问器,它将返回闭包形式的参数。

克罗克福德在Private Members in JavaScript上有一个很好的页面-绝对值得一读,看看不同的选择。

票数 12
EN

Stack Overflow用户

发布于 2010-08-25 17:13:01

这是Book.prototype在general Book inharets中的一篇文章about this。在第一个示例中,向getTitle Book.prototype添加函数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3564238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档