2014-01-16 44 views
5

鑑於像JavaScript代碼如下(從下面引用的插件中提取):Object.defineProperty替代了IE8

var AutosizeInput = (function() { 
    function AutosizeInput(input, options) { 
     var _this = this; 
     this._input = $(input); 
     this._options = options; 


    } 
    Object.defineProperty(AutosizeInput.prototype, "options", { 
     get: function() { 
      return this._options; 
     }, 
     enumerable: true, 
     configurable: true 
    }); 
} 
位於插件

全碼:https://github.com/MartinF/jQuery.Autosize.Input/blob/master/jquery.autosize.input.js

從我讀通話到Object.defineProperty將無法在IE8上工作,因爲這不是一個DOM對象。

這是否準確?如果是...哪種方法可以將這些getters(和setter)重寫爲符合IE8的最佳方式?

+2

總之,你不能。可能的重複[IE8中的JavaScript getter支持](http://stackoverflow.com/questions/7791267/javascript-getter-support-in-ie8) –

+0

爲什麼不簡單地使用'options'而不是'_options'? – Bergi

+0

有沒有人知道'_defineGetter_'在IE8中的作用? – Markasoftware

回答

6

IE8不支持非DOM對象屬性的getter/setter函數。

這裏的「解決方案」不是依賴屬性獲取器,而是使用完整的getter函數。

AutosizeInput.prototype.getOptions = function() { 
    return this._options; 
}; 

var input = new AutoresizeInput(); 
input.getOptions(); 

或者,而不是保持this._options「內部」變量,只是下降下劃線直接允許訪問。這樣你根本不需要魔法。

var AutoresizeInput = function() { 
    this.options = {}; 
} 

var input = new AutoresizeInput(); 
input.options(); 
+0

這實際上工作...我想我將不得不閱讀更多關於JavaScript和不同的方式來定義對象的句柄屬性。 – jdrm

2

您可以創建自己的類似

if (!Object.defineProperty) { 
      Object.defineProperty = function (obj, prop, descriptor) { 
       if (arguments.length < 3) { // all arguments required 
        throw new TypeError("Arguments not optional"); 
       } 

       prop += ""; // convert prop to string 
       ...  

你可以找到的代碼在這裏休息:

+1

https://github.com/inexorabletash/polyfill/blob/master/es5.js效果也不錯 –