Object.create еще не является стандартным для нескольких браузеров, например, IE8, Opera v11.5, Konq 4.3 не имеют его. Вы можете использовать версию Object.create Дугласа Крокфорда для этих браузеров, но она не включает второй параметр 'объект инициализации', используемый в ответе CMS.
Для кроссбраузерного кода одним из способов инициализации объекта в это время является настройка объекта Crocford's Object.create. Вот один из методов: -
Object.build = function(o) {
var initArgs = Array.prototype.slice.call(arguments,1)
function F() {
if((typeof o.init === 'function') && initArgs.length) {
o.init.apply(this,initArgs)
}
}
F.prototype = o
return new F()
}
Это поддерживает наследование прототипа Крокфорда, а также проверяет любой метод init в объекте, а затем запускает его с вашими параметрами, например, скажем new man ('John', 'Smith'). Ваш код становится: -
MY_GLOBAL = {i: 1, nextId: function(){return this.i++}} // For example
var userB = {
init: function(nameParam) {
this.id = MY_GLOBAL.nextId();
this.name = nameParam;
},
sayHello: function() {
console.log('Hello '+ this.name);
}
};
var bob = Object.build(userB, 'Bob'); // Different from your code
bob.sayHello();
Таким образом, bob наследует метод sayHello и теперь имеет собственные свойства id = 1 и name = 'Bob'. Эти свойства доступны как для записи, так и для перечисления. Это также намного более простой способ инициализации, чем для ECMA Object.create, особенно если вас не интересуют доступные для записи, перечисления и настраиваемые атрибуты.
Для инициализации без метода init можно использовать следующий мод Крокфорда: -
Object.gen = function(o) {
var makeArgs = arguments
function F() {
var prop, i=1, arg, val
for(prop in o) {
if(!o.hasOwnProperty(prop)) continue
val = o[prop]
arg = makeArgs[i++]
if(typeof arg === 'undefined') break
this[prop] = arg
}
}
F.prototype = o
return new F()
}
Это заполняет собственные свойства userB, в порядке их определения, используя параметры Object.gen слева направо после параметра userB. Он использует цикл for (prop in o), поэтому, согласно стандартам ECMA, порядок перечисления свойств не может быть гарантирован так же, как порядок определения свойства. Тем не менее, несколько примеров кода, протестированных в (4) основных браузерах, показывают, что они одинаковы при условии использования фильтра hasOwnProperty, а иногда даже если и нет.
MY_GLOBAL = {i: 1, nextId: function(){return this.i++}}; // For example
var userB = {
name: null,
id: null,
sayHello: function() {
console.log('Hello '+ this.name);
}
}
var bob = Object.gen(userB, 'Bob', MY_GLOBAL.nextId());
Несколько проще, чем Object.build, так как userB не нуждается в методе init. Также userB не является конструктором, а выглядит как обычный одноэлементный объект. Поэтому с помощью этого метода вы можете создавать и инициализировать обычные простые объекты.