2016-08-25 37 views
0

這是用來證實多態性例如,在其中如果刪除下面的行的一個示例:多態性實施例使用誤差在JavaScript

Employee.prototype= new Person(); 
Employee.prototype.constructor=Employee; 

仍有上的程序沒有影響,它得到了類似的結果。如果是這樣,這個例子是如何展示多態的?評論這些行時,我看到有2個函數,它們在調用返回結果時基於自己的getInfo函數;那麼,魔法在哪裏?

HTML:

<script type="text/javascript"> 
    function Person(age, weight) { 
    this.age=age; 
    this.weight=weight; 
    this.getInfo=function() { 
     return "I am " + this.age + " years old " + 
     "and weighs " + this.weight +" kilo."; 
    } 
    } 
    function Employee(age, weight, salary){ 
    this.salary=salary; 
    this.age=age; 
    this.weight=weight; 
    this.getInfo=function() { 
     return "I am " + this.age + " years old " + 
     "and weighs " + this.weight +" kilo " + 
     "and earns " + this.salary + " dollar."; 
    } 
    } 
    Employee.prototype= new Person(); 
    Employee.prototype.constructor=Employee; 
// The argument, 'obj', can be of any kind 
// which method, getInfo(), to be executed depend on the object 
// that 'obj' refer to. 
    function showInfo(obj) { 
    document.write(obj.getInfo()+"<br>"); 
    } 
    var person = new Person(50,90); 
    var employee = new Employee(43,80,50000); 
    showInfo(person); 
    showInfo(employee); 
</script> 

結果

enter image description here

參考

http://w3processing.com/index.php?subMenuItemId=329

回答

1

除了你已經注意到的問題之外,這實際上是一個多態性的弱例子。 Employee.prototype設置是superflous,原型功能從未在本例中使用),這裏有一對夫婦的其他問題,我看到:

  1. Employee功能(即構造)從來沒有所稱的「基類的構造函數即Person功能 - 你會認爲這是因爲他們在父母 - 子女關係中。從Parent功能
  2. 由於上述問題的結果,Employee功能代碼複製粘貼:

    this.salary=salary; this.age=age; this.weight=weight;

  3. 同上的getInfo功能 - 兩個構造創建它們的具體功能,併爲其分配到this;和Employee版本的getInfo從未調用基類版本 - 它也許應該,來證明繼承

    所以,真正唯一能贊成這個例子說的是,它使用相同的函數名即getInfoPersonEmployee並使用公共代碼在兩個對象上調用它們。該可稱爲多態性的一個例子,但可能是一個基本的一個

+0

這將是巨大的,如果你可以添加一個小提琴或提供一個合理的例子來學習的JS多態性行爲。請幫忙! – Deadpool

+0

請參閱[這篇文章](http://stackoverflow.com/questions/39117168/how-to-properly-subclass-a-subclass-in-javascript)討論基於原型的多態性。 [這個小提琴](https://jsfiddle.net/6x0agapd/)修復了上述文章中討論的代碼,並且是多態性的一個工作示例。 – Dhananjay

1

繼承「方法」

JavaScript沒有在基於類的語言定義它們的形式是「方法」。在JavaScript中,任何函數都可以以屬性的形式添加到對象中。繼承函數的作用與其他任何屬性一樣,包括如上所示的屬性遮蔽(在這種情況下爲方法重寫的一種形式)。

當一個繼承函數被執行時,它的值指向繼承對象,而不是原型對象,其中函數是一個屬性。

var o = { 
     a: 2, 
     m: function(b){ 
     return this.a + 1; 
     } 
    }; 

    console.log(o.m()); // 3 
    // When calling o.m in this case, 'this' refers to o 

    var p = Object.create(o); 
    // p is an object that inherits from o 

    p.a = 4; // creates an own property 'a' on p 
    console.log(p.m()); // 5 
    // when p.m is called, 'this' refers to p. 
    // So when p inherits the function m of o, 
    // 'this.a' means p.a, the own property 'a' of p 

你可以找到你要找的在MDN LINK