2009-11-01 9 views
4
if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     function F() {} 
     F.prototype = o; 
     return new F(); 
    }; 
} 
var o1 = {}; 
o1.init = function(){ 
    alert('o1'); 
}; 
var o2 = Object.create(o1); 
o2.init = function(){ 
    // how would I call my ancessors init()? 
    alert('o2'); 
}; 
o2.init(); 

回答

1

也許這太簡單了你想要完成的任務...將放置o2.init()在o2初始化函數工作?

o2.init = function(){ 
    // how would I call my ancessors init()? 
    alert('o2'); 
    o1.init(); 
}; 

出於好奇,是「ancessors」爲「祖先」或做「ancessors」是指特定的東西在這裏拼寫錯誤?你的意思是o2的「父母」對象?

3

JavaScript函數是對象,有兩個有用的方法來調用函數我的祖先的覆蓋方法:

Function.call(scope, [arg1, ...]) 
Function.apply(scope, args) 

您可以使用一個這些調用父類的實現,明確地傳遞thisscope參數,所以,在父類的實現,this指子對象:

var o1 = { 
    name : "One", 
    init : function() { 
     alert("o1: " + this.name); 
    } 
}; 

var o2 = Object.create(o1); 
o2.name = "Two"; 
o2.init = function() { 
    o1.init.call(this); 
    alert("o2: " + this name); 
}; 

這會提醒:o1: Twoo2: Two

+0

我不認爲這是進入問題的精神, o2如何知道o1變量的存在。對於任何這種嘗試在Javascript中進行面向對象開發的理解,你不能有這種耦合。 – AnthonyWJones 2009-11-01 21:17:27

+0

當然可以。如果你想調用你的原型的方法實現,你必須知道你的原型。這類似於C++中的類繼承,您必須知道父類才能調用重載方法('ParentClass :: method()')。 – 2009-11-02 08:52:06

+0

我不喜歡這個,就是你在創建o2後添加屬性。當使用new時,您可以在創建實例之前定義父級和子級的構造函數。你怎麼能完成與Object.create相同的? – JohnMerlino 2014-09-01 05:33:50

0

在支持它的瀏覽器,你可以使用Object.getPrototypeOf功能,像這樣:

o2.init = function(){ 
    Object.getPrototypeOf(this).init.call(this); 
    alert('o2'); 
}; 

這將得到o2o1)的原型,並應用其init方法本(o2),就像一個super.init()在其他語言。

UPDATE:

Object.getPrototypeOf功能可以這樣實現:

if (typeof Object.getPrototypeOf !== "function") 
{ 
    if (typeof ({}).__proto__ === "object") 
    { 
     Object.getPrototypeOf = function(object) 
     { 
      return object.__proto__; 
     }; 
    } 
    else 
    { 
     Object.getPrototypeOf = function(object) 
     { 
      // May break if the constructor has been tampered with 
      return object.constructor.prototype; 
     }; 
    } 
} 

發現此鏈接:http://ejohn.org/blog/objectgetprototypeof/