2013-05-17 123 views
0

是什么的两种方式继承定义如下JavaScript类继承

function Rectangle(w,h){ 
    this.width=w; 
    this.height.h; 
    this.area=function(){return this.width*this.height;} 
} 

function Rectangle(w,h){ 
    this.width=w; 
    this.height.h; 

} 
Rectangle.prototype.area=function(){return this.width*this.height;} 

我看到有人说,第一种方式是低效的使用常规性质的差异的差异旨在由同一类的所有对象共享的方法。

欢迎任何评论

+1

您应该将实例之间共享的方法放在'prototype'中,否则您会克隆每个实例上的方法。 – elclanrs

+0

那么,这个人是对的:) –

+1

哇,没有多少重复是*确切的。代码从哪里来? (编辑:从来没有想过,从另一个问题看出来) – bfavaretto

回答

0

第一种方法是,每次构建新的Rectangle时,都会创建一个新的匿名函数并将其分配给this.area。如果你要构造多个Rectangle,第二种方法更有效率,因为匿名函数仍然只创建一次,所有Rectangles都可以通过其原型访问它。

+0

不确定术语“匿名函数”在这里很有用。该声明是[*函数表达式*]的分配(http://www.ecma-international.org/ecma-262/5。1 /#sec-13)转换为对象属性。正式的名字是可选的(在这种情况下没有用),但它不是真正的“匿名”。 – RobG

1

第一种方式,你可以在区域函数中使用W和H直接,等于将它们作为私有变量。

function Rec(w,h) { 
    this.setW=function(newW){ 
     w=newW; 
    } 
    this.area=function(){ 
     return w*h; 
    } 
} 

var rec=new Rec(5,6); 

你不能做alert(rec.w)或rec.w = 5。因为课堂内部没有这个。 但你可以做

rec.setW(2); 
alert(rec.area()); 

这将提醒12

http://jsfiddle.net/vanessachem/Hmyyc/这样。 w和h可以被视为私有变量。他们只能通过类内的setter函数重置。

当您需要创建多个实例时效率低下。如果你只是想创建单身人士,第一个很容易管理。

第二个优点是你可以把原型函数放在不同的文件中。这对多个实例很有用。但是,您不能将w和h视为私有变量。您不能直接在区域功能中使用w或h。

+1

在两种方式中,'w'和'h'都不是*私有的。 –

+1

对于我理解的私有变量,类内的函数可以使用像w或h这样的变量,而对象实例不能访问w或h。在方法1中,类内的函数可以使用w和h(不是宽度和高度)。但在方法2中,类内的函数无法访问w和h。 –

+0

没有什么是私密的,它们是函数参数。 –