1. ホーム
  2. javascript

[解決済み] "new "の代わりに "Object.create "を使用する。

2022-03-26 22:02:41

質問

Javascript 1.9.3 / ECMAScript 5 を導入しました。 Object.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レベルしか継承していないため、この例では Object.create .

このメソッドを使用すると、簡単に ディファレンシャルインテリジェンス この場合、オブジェクトは他のオブジェクトを直接継承することができます。

あなたの userB の例では、あなたの init メソッドはパブリックであるべきであり、存在すらしてはならない、もし既存のオブジェクトインスタンスでこのメソッドを再度呼び出すと idname プロパティが変更されます。

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
  }
});

ご覧の通り、プロパティは第2引数の Object.create で使用される構文と同様の構文を使用したオブジェクト リテラルを使用します。 Object.definePropertiesObject.defineProperty メソッドを使用します。

これは、プロパティの属性を設定することができます ( enumerable , writable または configurable を使用すると、本当に便利です。