原型的目的是什么?
可能重复:
了解JavaScript中的原型inheritance
好的,所以我对JS中OOP的想法有点新鲜。
这两个代码片段之间有什么区别:
function animal(){ this.name = 'rover'; this.set_name = function(name){ this.name = name; } }
function animal(){ this.name = 'rover'; } animal.prototype.set_name = function(name){ this.name = name; }
他们都做同样的事情,有什么区别?
使用原型可以更快地创build对象,因为每次创build新对象时都不必重新创build该函数。
当你这样做:
function animal(){ this.name = 'rover'; this.set_name = function(name){ this.name = name; } }
每次创build动物时,都会重新创buildset_name
函数。 但是,当你这样做
animal.prototype.set_name = function(name){ this.name = name; }
该function不必每次重新创build; 它存在于原型中的一个地方。 所以当你调用someAnimal.set_name("Ubu");
this
上下文将被设置为someAnimal
并且(唯一的) set_name
函数将被调用。
使用第一种语法有一个好处:以这种方式创build的函数可以访问私有数据:
function animal(){ var privateData = 'foo' this.name = 'rover'; this.set_name = function(name){ this.name = name; alert(privateData); //will alert 'foo' } }
道格拉斯·克罗克福德(Douglas Crockford)把这样的function称为“有特权的”:出于这个原因,他们可以访问公共和私人数据。
从这些函数中创build新的对象时会出现差异
var animal1 = new animal();
由第一个函数创build的所有对象将具有不同的name
和set_name
属性。 但是,由第二个函数创build的所有对象将共享set_name
属性。
在第一个例子中,每个单独的动物对于set_name函数都有自己的属性,而在第二个示例中,它们通过它们的原型共享相同的函数。
第一个版本的优点是方法可以访问在构造函数中声明的本地(私有)variables。
第二种方法的好处是它只需要更less的内存(因为你只存储了一次而不是一百万次),而且在当前的JS引擎中更具性能。
使用第二种方法,您还可以修改或向方法中添加方法,这样也会影响已创build的实例。