2012-02-15 62 views
3

我想要實現一種單獨對象(下例中的About),它本身位於另一個對象(Main)內。在IE8中初始化另一個對象內的對象失敗

這是我的代碼。它適用於所有主流瀏覽器(Firefox,Chrome甚至IE9),但不適用於IE8。在IE8中,main.About.doSomething();的調用拋出'Object不支持這個屬性或方法'。

這裏我也jsFiddled我的代碼:http://jsfiddle.net/c3URh/12/

我需要爲了得到它在IE8怎麼辦?

注:我可以打電話main.About().doSomething(),它會在IE8的工作,但不會在其他瀏覽器中運行的,反正它是從面向對象的角度不正確。

我的缺陷代碼:

function About(){ 
    this.doSomething = function(){ 
     alert('a'); 
    }; 
} 

function Main(){ 
    var about; 
    try { 
    Object.defineProperty(this, 'About', { 
      get: function() { 
       if (about == undefined) { 
        about = new About(); 
       } 
       return about; 
      } 
     }); 
    } 
    catch (e) { 
     // this code does not work in ie8. Throwing 'Object doesn't support this property or method' 
     this.About = function() { 
      if (about == undefined) { 
       about = new About(); 
      } 
      return about; 
     }; 
    } 
} 

function clickMe() 
{ 
    var main = new Main(); 
    main.About.doSomething(); 
} 
​ 

回答

3

IE8不支持Object.defineProperty。所以,catch塊的代碼被執行。在那個塊中,你沒有定義一個適當的替換About獲得者。

本(內catch)是一個函數:

this.About = function() { 
     if (about == undefined) { 
      about = new About(); 
     } 
     return about; 
    }; 

當你教人口會它是About一個實例。 IE8不支持getter,所以你必須使用另一種方法。最接近你可以得到的是:

this.About = about == undefined ? new About() : about; 
1

有IE9之前沒有getter和這個代碼是真是滑稽。使用getter來實例化一個私有變量,並添加一個檢查,以便它只在第一次執行它?這就是構造函數的用途。

function About(){ 
    this.doSomething = function(){ 
     alert('a'); 
    }; 
} 

function Main(){ 
    this.About = new About(); 
} 

var main = new Main(); 
main.About.doSomething(); // alerts 'a' 

這不會解決你如何實現在IE8的getter和下面的問題,但你在一個糟糕的方式使用它,無論如何

http://jsfiddle.net/mendesjuan/zPq4v/