2014-04-23 26 views
1

需要了解寄生蟲遺傳實際上做了什麼。需要了解Javascript寄生遺傳

我提到這個鏈接:Parasitic Inheritance in javascript

我需要了解一下這個例子做:

Shape = {name: 'Shape'}; 
Shape.prototype.toString = function() 
{ 
    return this.name; 
}; 

function Rectangle(width, height) { 
    var rect; 
    P = function() {}; 
    P.prototype = Shape; 
    rect = new P(); 
    rect.width = width; 
    rect.height = height; 
    return rect; 
} 

第二個例子能正常工作,但我需要知道「哪裏寄生繼承進入圖片?

var Person = function(name, age) 
{ 
    this.name = name; 
    this.age = age; 
}; 

var Employee = function(name, age, group) 
{ 
    var e = new Person(name, age); 
    e.group = group; 
    return e; 
}; 

var testname= new Employee('ABC', 30, 'Developer'); 

謝謝。

+0

它不起作用。 – thefourtheye

+0

但鏈接使用這個例子,我無法理解邏輯。 –

+0

嘗試在某處執行它。 – thefourtheye

回答

2

JavaScript使用原型模型進行繼承。這意味着您可以通過複製現有對象並添加屬性來創建新對象;一個對象的原型只是另一個對象。

在大多數的面嚮對象語言,如C++,Java和等等,有類和實例嚴格的系統;如果您想要一個像Foo一樣但具有Hat屬性的Bar,則必須定義從Foo繼承的類Bar(或包含Foo的實例),然後實例化該類以創建新的BarObject。相比之下在Javascript中,你所擁有的只是實例,創建一個新類型只需要添加一個新的類型。

在您的示例中,Employee構造函數返回已修改的Person對象,以添加group屬性,而不是返回新的Employee對象。它寄生在人身上,但是被這個新財產所延伸。

4

第一個例子:

它不會工作,因爲所有的對象文本({..})從Object.prototype繼承。所以,他們不會有prototype屬性(只有函數對象將具有prototype屬性)。所以,Shape.prototypeundefined,你嘗試在undefined創建toString屬性,這是不可能的。這就是它失敗的原因。

第二個例子:

在此之前,寄生繼承的想法。子構造函數首先用Parent的構造函數構造一個對象。然後它將它擴充到它的需要並返回父類型的自定義對象。由於該對象是父類型的,因此它仍然可以訪問父級原型對象中的函數和數據。

Parasitism wikipedia page報價,

物種之間的關係,其中一個物種,寄生蟲,在其他的費用收益,主持人。

在這裏,孩子是寄生蟲,它使用父構造函數(主機)。

說明:子構造函數中的return語句非常重要。它必須返回新構造的對象。否則,默認情況下會返回一個新構造的子類型對象。