Имея дело с Object.create(), я столкнулся с этим вопросом и в целом в нем упоминается:

  • polyfill, который использовался для модификации IE8 с помощью Object.create функциональность, однако этот полифилл не поддерживает второй параметр
  • прокладка, которая требует включения es5-shim

С различными ходами мыслей о том, как лучше всего этого добиться.

Вот мой соответствующий код, который я использую:

//json_string variable is passed via php

var arrayOfOptions = jQuery.parseJSON(json_string);

var template = {
     // my instance that I want to initialize based on the properties provided
};

var instance = Object.create(template, {'options':{value:arrayOfOptions, enumerable: true}});

У меня вопрос: как программисты выполняли эту задачу до ES5, и, в частности, какие были бы лучшие / альтернативные реализации инициализации объекта на основе набора переданных свойств без использования второго параметра?

1
zoranc 11 Мар 2014 в 15:32
1
Вы не могли ожидать наличия собственных объектов dom на ie8.
 – 
mpm
11 Мар 2014 в 15:57
Вот вопрос, который касается настройки перечислимого свойства до ES5 stackoverflow.com/questions/8918030/…
 – 
martskins
11 Мар 2014 в 16:00

1 ответ

Лучший ответ

как программисты решали эту задачу до ES5

Нисколько. В ES3 были атрибуты свойств, но не было возможности установить их. Не было и Object.create. Только что был .propertyIsEnumerable(), чтобы получить DontEnum флаг.

Каковы были бы лучшие / альтернативные реализации инициализации объекта на основе набора переданных свойств без использования второго параметра?

Используйте функцию extend. Пример с jQuery:

var instance = $.extend(Object.create(template), {options:arrayOfOptions});

Пример с самодельной вспомогательной функцией:

function createAndExtend(proto, props) {
    var o = Object.create(proto);
    for (var p in props)
        o[p] = props[p];
    return o;
}
var instance = createAndExtend(template, {options:arrayOfOptions});

В любом случае вам вряд ли когда-нибудь понадобятся дескрипторы свойств.

2
Bergi 11 Мар 2014 в 17:36