2016-09-27 196 views
1

我無法正確覆蓋繼承的對象,並想知道我是否可以在這裏找到一隻手。已經被卡住了3天了。JS嵌套繼承

function Person() { 
    function getValue(){ 
     serviceArea(); 
    } 

    function serviceArea() { 
     alert('Old Location'); 
    } 

    return { 
     getValue: getValue, 
     serviceArea: serviceArea 
    } 
} 

然後

function Student() {}; 
Student.prototype = new Person(); 
Student.prototype.serviceArea = function() { alert('New Location'); }; 
var bobStu = new Student(); 

當我運行bobStu.serviceArea();我得到'New Location',但是當我運行bobStu.getValue();我得到'Old Location'

我通過這個bobStu.getValue();向下方法需要調用重寫的方法,但我無法做到這一點。你能解釋爲什麼getValue()調用舊的serviceArea()?以及如何正確地做到這一點?

我在這篇文章已經準備好了很多次,覺得這是告訴我的東西,但我太燒,我不能讓它:(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#Namespace

+0

你的'Person'是一個工廠函數,不是一個經典的構造函數,它的範圍並不關心屬性。 – Bergi

+0

你可能會在這個線程中找到答案http://stackoverflow.com/questions/12183011/javascript-redefine-and-override-existing-function-body有用。 – Rosa

回答

3

只需使用serviceArea()僅指功能serviceAreaPerson範圍定義:

function Person() { 
    function getValue(){ 
     serviceArea(); // this... 
    } 

    // ...always refers to this, independent of the object you're constructing 
    function serviceArea() { 
     alert('Old Location'); 
    } 

    // also note this: 
    this.getValue = getValue; 
    this.serviceArea = serviceArea; 
} 

使用this.serviceArea(),而是如果你想使用由子類實現的serviceArea方法

另外,構造函數不應該返回值;請將值直接附加到this值。