Object.defineProperty в ES5?

Я вижу сообщения о «новом» Object.create, который делает перечисление настраиваемым. Однако он опирается на метод Object.defineProperty. Я не могу найти кросс-браузерную реализацию для этого метода.

Мы застряли писать для старого Object.create? Я не могу писать вещи, которые не будут работать в IE6 / 7.

 kzh02 мар. 2011 г., 20:44
Там всегда хромированная рамка!

Ответы на вопрос(1)

Решение Вопроса

Object.create метод в среде ECMAScript 3.

Как вы видели, аргумент свойств создаст вам проблемы, поскольку в реализациях на основе E3ни за что изменить атрибуты свойства.

Object.defineProperty метод как@Raynos упоминается, работает на IE8, ночастичноможно использоватьтолько в элементах DOM.

Такжесвойства доступа даст вам проблемы, они могут бытьпередразнил с широко поддерживаемыми нестандартными методами, такими как__defineGetter__/__defineSetter__но опять же тыне может изменить атрибуты свойства.

Другая проблема, кроме дескрипторов свойств, заключается в том, чтоObject.create метод может принятьnull в качестве аргумента, чтобы создать объект, который не наследует ни от чего.

Это нельзя эмулировать сКрокфорд-хObject.create шайбапотому что когдаnew Оператор используется с функцией конструктора, которая имеетprototype свойство, содержащееnull -или любое другое не-объектное значение-, новый объект будет наследоваться отObject.prototype в любом случае по умолчанию.

В некоторых реализациях -V8, Spidermonkey, Rhino и т. Д. - они имеют возможность установки__proto__ свойство, которое может быть использовано для установкиnull [[Prototype]], но, опять же, это нестандартно и наверняка никогда не будет работать в IE.

Я бы порекомендовал, если вы хотите настроить старые браузеры так, чтобы они не использовали эти функции, поскольку в этих средах невозможно заставить их работать должным образом.

Если вы все еще хотите использоватьObject.createбез использованиясвойства аргумент, вы могли бы, однако я бы порекомендовал вам обнаружить вещи, которые нельзя подражать.

Следующее будетбезопаснее версияКрокфорд-хObject.create шайба:

if (typeof Object.create != 'function') {
  (function () {
    var F = function () {};
    Object.create = function (o) {
      if (arguments.length > 1) { throw Error('Second argument not supported');}
      if (o === null) { throw Error('Cannot set a null [[Prototype]]');}
      if (typeof o != 'object') { throw TypeError('Argument must be an object');}
      F.prototype = o;
      return new F;
    };
  })();
}

В любом случае, используйте это осторожно.

Ваш ответ на вопрос