2013-05-17 56 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

沒有什麼是私密的,它們是函數參數。 –