「new」の代わりに「Object.create」を使用する 質問する

「new」の代わりに「Object.create」を使用する 質問する

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。既存のオブジェクト インスタンスでこのメソッドを再度呼び出すと、プロパティidnameプロパティが変更されます。

Object.create2 番目の引数を使用してオブジェクトのプロパティを初期化できます。例:

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.definePropertiesObject.defineProperty

プロパティ属性 ( enumerablewritable、またはconfigurable) を設定できるので、非常に便利です。

おすすめ記事