Qui*_*ike 222 javascript prototype-programming
可能重复:
了解JavaScript中的原型继承
好的,所以我对JS中的OOP概念有些新意.
这两个代码片段之间有什么区别:
function animal(){
this.name = 'rover';
this.set_name = function(name){
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
function animal(){
this.name = 'rover';
}
animal.prototype.set_name = function(name){
this.name = name;
}
Run Code Online (Sandbox Code Playgroud)
他们都做同样的事情,那有什么区别?
Ada*_*kis 316
使用原型可以更快地创建对象,因为每次创建新对象时都不必重新创建该函数.
当你这样做:
function animal(){
this.name = 'rover';
this.set_name = function(name){
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
每次创建动物时都会从头set_name
创建该功能.但是当你这样做的时候
animal.prototype.set_name = function(name){
this.name = name;
}
Run Code Online (Sandbox Code Playgroud)
每次都不需要重新创建该功能; 它存在于原型的一个地方.所以,当你打电话someAnimal.set_name("Ubu");
的this
情况下将被设置为someAnimal
和(独一无二的)set_name
函数将被调用.
使用第一种语法有一个好处:以这种方式创建的函数可以访问私有数据:
function animal(){
var privateData = 'foo'
this.name = 'rover';
this.set_name = function(name){
this.name = name;
alert(privateData); //will alert 'foo'
}
}
Run Code Online (Sandbox Code Playgroud)
道格拉斯·克罗克福德(Douglas Crockford)将这种"特权"创建的函数称为"特权":他们可以访问公共数据和私有数据.
小智 33
从这些函数创建新对象时会出现差异
var animal1 = new animal();
Run Code Online (Sandbox Code Playgroud)
由第一函数创建的所有对象都会有不同的name
和set_name
特性.但是,第二个函数创建的所有对象都将共享该set_name
属性.
hug*_*omg 23
在第一个示例中,每个单独的动物都有自己的set_name函数属性,而在第二个示例中,它们通过原型共享相同的函数.
第一个版本的优点是方法可以访问构造函数内声明的本地(私有)变量.
第二种方法的优点是它需要更少的内存(因为你只存储一次方法而不是一百万次),并且在当前的JS引擎中更具性能.
使用第二种方法,您还可以以同样影响已创建实例的方式修改或添加方法.
归档时间: |
|
查看次数: |
54775 次 |
最近记录: |