IE8的Object.defineProperty替代方法

8

假设有以下 JavaScript 代码(从下面引用的插件中提取):

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对象。

这个判断准确吗?如果是的话,重写getter(和setter)以兼容IE8的最佳方法是什么?


2
简而言之,你不能。可能是JavaScript getter support in IE8的重复。 - Alex Wayne
为什么不直接使用 options 而非 _options - Bergi
有人知道 _defineGetter_ 在 IE8 中是否可用吗? - markasoftware
2个回答

8

IE8不支持非DOM对象属性的getter/setter函数。

这里的“解决方案”是不要依赖属性getter,而是使用完整的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();

这真的起作用了...我想我得多读一些关于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://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__lookupGetter__等在IE8中不受支持。 - bxk21
1
谢谢,@bxk21。我会相应地更新帖子。 - Dalorzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接