Javascript 1.9.3 / ECMAScript 5Object.create
では、Douglas Crockford氏らが開発した が導入されました。主張する長い間。new
以下のコードの を に置き換えるにはどうすればいいでしょうかObject.create
?
var UserA = function(nameParam) {
this.id = MY_GLOBAL.nextId();
this.name = nameParam;
}
UserA.prototype.sayHello = function() {
console.log('Hello '+ this.name);
}
var bob = new UserA('bob');
bob.sayHello();
(MY_GLOBAL.nextId
存在すると仮定します)。
私が思いつく最善のものは次のとおりです。
var userB = {
init: function(nameParam) {
this.id = MY_GLOBAL.nextId();
this.name = nameParam;
},
sayHello: function() {
console.log('Hello '+ this.name);
}
};
var bob = Object.create(userB);
bob.init('Bob');
bob.sayHello();
利点がないように思えるので、理解できていないと思います。おそらく、私は新古典主義的すぎるのでしょう。Object.create
ユーザー「bob」を作成するには、どのように使用すればよいですか?
ベストアンサー1
継承レベルが1つしかない場合、この例では、Object.create
。
このメソッドを使用すると、オブジェクトが他のオブジェクトから直接継承できる差分継承を簡単に実装できます。
あなたのuserB
例では、メソッドはパブリックである必要はなく、存在する必要もないと思いますinit
。既存のオブジェクト インスタンスでこのメソッドを再度呼び出すと、プロパティid
とname
プロパティが変更されます。
Object.create
2 番目の引数を使用してオブジェクトのプロパティを初期化できます。例:
var userB = {
sayHello: function() {
console.log('Hello '+ this.name);
}
};
var bob = Object.create(userB, {
'id' : {
value: MY_GLOBAL.nextId(),
enumerable:true // writable:false, configurable(deletable):false by default
},
'name': {
value: 'Bob',
enumerable: true
}
});
ご覧のとおり、プロパティは、およびメソッドObject.create
で使用される に似た構文を使用したオブジェクト リテラルを使用して、の 2 番目の引数で初期化できます。Object.defineProperties
Object.defineProperty
プロパティ属性 ( enumerable
、writable
、またはconfigurable
) を設定できるので、非常に便利です。