Object.createは、IE8、Opera v11.5、Konq 4.3など、いくつかのブラウザではまだ標準ではありません。これらのブラウザには、ダグラスクロックフォードのバージョンのObject.createを使用できますが、これには、CMSの回答で使用される2番目の「初期化オブジェクト」パラメータは含まれていません。
クロスブラウザコードの場合、その間にオブジェクトを初期化する1つの方法は、CrockfordのObject.createをカスタマイズすることです。これが1つの方法です:-
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()
}
これにより、Crockfordのプロトタイプの継承が維持され、オブジェクト内の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'を持ちます。もちろん、これらのプロパティは書き込み可能であり、列挙可能です。これは、特に書き込み可能、列挙可能、構成可能な属性を気にしない場合は、ECMAObject.createよりもはるかに簡単に初期化する方法です。
initメソッドを使用しない初期化には、次のCrockfordmodを使用できます。
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());
userBはinitメソッドを必要としないので、Object.buildよりもやや簡単です。また、userBは特にコンストラクターではありませんが、通常のシングルトンオブジェクトのように見えます。したがって、このメソッドを使用すると、通常のプレーンオブジェクトから構築および初期化できます。