我从reader
编写了Person
的简短继承代码:
<script>
/* Class Person. */
function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name;
}
var reader = new Person('John Smith');
alert(reader.getName());
</script>
或者,我可以删除Person.prototype.getName = function() { return this.name; }
行,并在Person对象中创建它。例如
<script>
/* Class Person. */
function Person(name) {
this.name = name;
this.getName = function() { return this.name;}
}
var reader = new Person('John Smith');
alert(reader.getName());
</script>
在这两种情况下调用getName()
时,我得到了相同的结果。那他们有什么不同呢?
答案 0 :(得分:21)
当您在原型上添加某些内容时,对象的每个实例都会为该方法共享相同的代码。它们都使用相同的函数实例。
当您只在this
上放置方法时,每个对象实例都有自己的副本相同的方法。
使用prototype
效率更高。请注意,这就是为什么通常将方法放在原型上的原因,因为您通常希望所有实例都使用相同的方法,但属性放在实例本身上,因为通常您不希望所有实例共享相同的属性。
对于您的注释,如果您在对象的构造函数上放置一个方法,那么您实际上已经创建了一个“静态”方法。没有该对象的实例将具有该方法,它们都必须在构造函数上访问它。所以在你的情况下,Person.someMethod()
。
答案 1 :(得分:3)
不同之处在于,当您将其放在原型上时, Person
的所有实例共享getName
的相同代码 - 您可以更改getName
在所有实例Person
上分配其他内容:
Person.prototype.getName = function() { return 'Mr Jones' };
此外,由于它们共享相同的代码,因此内存密集程度较低:您只有getName
函数的一个副本,而不是每个实例一个副本。
另一个区别是你可以稍后将Person
设置为另一个类的原型,比方说Man
,它将继承属性/方法。
更新:这是一篇很好的文章,解释原型的其他属性:https://stackoverflow.com/a/1534286/295262
答案 2 :(得分:2)
区别在于你是否进一步扩展了Person类,子类不会继承getName()方法
编辑:我在上述声明中不正确。刚刚在jsfiddle上测试过。无论我们是在原型上还是在函数实例本身上定义方法,它都可用于链中的子类。
以下是证明:http://jsfiddle.net/u8qrd/
我知道将方法附加到原型有一个性能/内存的好处。那个公寓在继承方面没有任何行为差异吗?
(希望我在这里提问不违反SO规则)
答案 3 :(得分:2)
当你将方法放在构造函数中并从该构造函数中创建一个对象时,每个对象都带有它自己的getName
函数。对于10个Person
个实例,每个实例都带有自己的getName
个,因此有10个单独的getName
个函数。
如果将getName
放在构造函数的原型中,则在所有实例中共享/继承相同的getName
函数。因此,对于Person
的10个实例,每个实例都有getName
,但仅指1 getName
个函数。
使用原型可以节省内存,因为该方法是跨实例共享的,所以只使用了一个。
答案 4 :(得分:0)
在基于类的单词中,通过prototype
和this
声明函数之间的区别是这样的:
<强>原型:强>
实例的功能如下所示:
somefunc = function(){super()/*call the function of the super-class*/};
<强>这样:强>
实例的功能如下所示:
somefunc = function(){/* Do same stuff as in the prototype func declared */};
现在更改原型上的函数对实例没有任何影响。
答案 5 :(得分:0)
将带有http://localhost/zendAuth/application/views/scripts/employee/add.phtml
的任何函数添加到任何对象构造函数时,由该构造函数创建的每个对象都将自己复制该函数,这也会占用内存。想象一下,如果您有多个对象是由同一构造函数创建的,那么它将占用多少内存。另一方面,当您使用this.functionname
创建函数时,函数在内存中仅加载一次,并且每个对象共享相同的原型函数构造函数。这种方法可以使您的代码在加载和操作中更快,并且可以节省大量内存。