2017-04-19 70 views
1

當函數位於父對象內的另一個對象上時,如何覆蓋javascript對象上的函數。覆蓋javascript對象屬性上的函數

例子:

function TestingABC() { 
    this.events = { finish: function() { console.log("FINISHED"); } }; 
} 

function TestingXYZ() { 
    TestingABC.call(this); 
} 

TestingXYZ.prototype = Object.create(TestingABC.prototype); 

我怎麼會凌駕於TestingXYZ的events.finish功能與一些新的代碼,我需要寫沿運行父(TestingABC)代碼?

+1

'VAR舊= this.events.finish?; this.events.finish = function(){console.log('new function'); old.call(本); };'? – zerkms

+0

@RobG你爲什麼要刪除你的答案? – zerkms

回答

0

因爲events對象實例的屬性,而不是在原型,你可以採用打補丁,您存儲當前函數的引用類似猴子的技術,然後用一個覆蓋當前功能,可以除了做其他的事情之外,還請稱老的。

例如

function TestingABC() { 
    this.events = { finish: function() { console.log("FINISHED"); } }; 
} 

function TestingXYZ() { 
    TestingABC.call(this); 
    var superEvents = this.events; 
    this.events = { 
     finish: function() { 
       superEvents.finish(); 
       doMyStuff(); 
     } 
    }; 
} 

TestingXYZ.prototype = Object.create(TestingABC.prototype); 
+0

'TestingXYZ.prototype.constructor = TestingXYZ'怎麼樣? :D – Badacadabra

+0

@Badacadabra我不確定你的意思,對不起。 – GregL

+1

沒問題......;)事實上,在ES5中使用繼承時,這通常是「重新映射」構造函數的好主意。 'Object.create()'接受父類「class」的整個原型,其中包括父構造函數。但是,「子類」的真正構造函數不是父構造函數......這就是上述代碼有用的地方。 :) – Badacadabra

0

.eventsTestingABC()構造的一個實例化的屬性 - 所以一旦你擁有它的一個實例,你可以修改的值。

也許這樣的事情是你追求的...

function TestingABC() { 
    this.events = { 
     finish: function() { 
      console.log('ABC FINISHED'); 
     }, 
     other: function() { 
      console.log('ABC OTHER'); 
     } 
    }; 
} 

function TestingXYZ() { 
    TestingABC.call(this); 
} 

TestingXYZ.prototype = Object.create(TestingABC.prototype); 

TestingXYZ.prototype.callEvents = function() { 
    this.events.finish(); 
    this.events.other(); 
} 

var test1 = new TestingABC(); 
var test2 = new TestingXYZ(); 

test2.events.finish = function() { 
    console.log('XYZ FINISHED'); 
}; 

test1.events.finish(); 
test1.events.other(); 
//-> ABC FINISHED 
//-> ABC OTHER 

test2.callEvents(); 
//-> XYZ FINISHED 
//-> ABC OTHER