7

EcmaScript 5 JavaScript のクラスに静的関数を追加したいと考えています。私のクラス定義は次のようになります。

var Account = {};

Object.defineProperty(Account, 'id', {
    value : null
});

そして、次のような新しいインスタンスを作成します。

var theAccount = Object.create(Account);
theAccount.id = 123456;

Account次に、クラスに静的関数を追加します。コンストラクター関数と次のようなプロパティAccountを使用してクラスを作成した場合:prototype

var Account = function () {
    this.id = null;
};

...私はただ行うことができます:

Account.instances = {};

Account.createInstance = function () {
    var account = new Account();
    account.id = uuid.v4();
    Account.instances[account.id] = account;
    return account;
};

しかし、メンバーを追加するためにプロパティでObject.definePropertyはなく使用しているため、呼び出し時にインスタンス化されるため、インスタンスのプロパティになります。prototypeAccount.instancesAccount.createInstanceObject.create

EcmaScript 5 スタイルのオブジェクト作成を使用する場合、クラスに静的メンバーを追加するにはどうすればよいですか?

4

4 に答える 4

1

しかし、プロトタイプ プロパティではなく Object.defineProperty を使用してメンバーを追加しているため、Object.create を呼び出すと Account.instances と Account.createInstance もインスタンス化され、インスタンスのプロパティになります。

ソース オブジェクトで宣言された静的プロパティまたはメソッドは、インスタンスのプロパティとはみなされず、プロトタイプから読み取られます。

    var obj = {};
    obj.static = function() { alert('hello'); }
    var instance = Object.create(obj);
    instance.ownProperty = 'hello';
    alert(!!instance.static); //true - it has .static
    alert(instance.hasOwnProperty('static')); //false - but it's not its own
    alert(instance.hasOwnProperty('ownProperty')); //true
于 2012-07-27T13:33:11.933 に答える
1

できません。

私のクラス定義は次のようになりますvar Account = {};

これはクラスではなく (古典的なモデルをそのように呼ぶ場合)、単なるプロトタイプ オブジェクトです。それだけしかないので、インスタンスキャッシュや作成関数などの静的メンバーに他の変数を使用する必要があります。

var Account = {...};
var instances = [];
function createAccount(){...}

もちろん、それらに名前を付けることができます:

var Account = {
    proto: {...},
    instances: [],
    instantiate: function create(){...}
};

...しかし、それは古典的なパターンに非常に近いですね。唯一の違いは、名前空間オブジェクトとしてcreateのコンストラクター関数ではなく、名前空間オブジェクトに関数があったことです。

Object.create Prototype Chainsという質問にも興味があるかもしれません。ここではすべての「クラス オブジェクト」が.createinheritbase


コメントであなたの質問にさらに答えてください:

Object.create は、EcmaScript 5 で new 演算子を廃止しませんか?

いいえ。newキーワードは 2 つのことを行います。新しいインスタンスのプロトタイプ チェーンをセットアップし、コンストラクター関数を適用します。Object.create最初のことだけを行うので、関数が必要ない場合 (または実行したくない場合) に使用できます。

あなたの場合、そのような機能があるので、ここでも古典的なモデルは間違っていません。「new」の代わりに「Object.create」を使用するも参照してください。

于 2012-07-27T13:33:29.233 に答える
1

いろいろとごちゃまぜになっているようですね。プロトタイプは共有フォールバック プロパティになります。静的を定義したい場合(あなたがしていることは、書き込み不可のプロパティを意味していると思いますか?)コンストラクターでdefinePropertyを使用できます。

function Account(){
  Object.defineProperty(this, 'id', {
    value: uuid.v4()
  });
  Account.instances[this.id] = this;
}

Account.instances = {};

Account.prototype.id = null;


var account = new Account;
于 2012-07-27T11:48:52.730 に答える