我很好奇下面这几种面向对象的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
function Book(title) {
var book = {
title: title
};
book.getTitle = function () {
return this.title;
};
return book;
}
var myBook = Book('War and Peace');
alert(myBook.getTitle())
发布于 2010-08-25 17:02:56
第二个并不是真正创建一个实例,它只是返回一个对象。这意味着你不能利用像instanceof
这样的运算符。例如:在第一种情况下,您可以执行if (myBook instanceof Book)
来检查变量是否为Book类型,而在第二种情况下,这将失败。
如果你想在构造函数中指定你的对象方法,这是正确的方法:
function Book(title) {
this.title = title;
this.getTitle = function () {
return this.title;
};
}
var myBook = new Book('War and Peace');
alert(myBook.getTitle())
虽然在本例中两者的行为方式完全相同,但也存在差异。使用基于闭包的实现,您可以拥有私有变量和方法(只是不要在this
对象中公开它们)。因此,您可以执行以下操作:
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
发布于 2010-08-25 17:03:32
前一种方法是如何使用JavaScript的。后者是一种更现代的技术,部分是由道格拉斯·克罗克福德推广的。这种技术要灵活得多。
您还可以执行以下操作:
function Book(title) {
return {
getTitle: function () {
return title;
}
}
}
返回的对象将只有一个名为getTitle
的访问器,它将返回闭包形式的参数。
克罗克福德在Private Members in JavaScript上有一个很好的页面-绝对值得一读,看看不同的选择。
发布于 2010-08-25 17:13:01
这是Book.prototype在general Book inharets中的一篇文章about this。在第一个示例中,向getTitle Book.prototype添加函数
https://stackoverflow.com/questions/3564238
复制相似问题