0

次のようなコンストラクターを使用してオブジェクトを作成すると、次のようになります。

function Person(name, age) {
  this.name = name;
  this.age = age;
 }

(静的)クラスメソッドのように機能するコンストラクター関数に関数であるプロパティを追加できます。Object.createはそれをサポートしていないようです。そうですか?Object.createによって作成されたすべてのオブジェクトのコンストラクタープロパティは同じ関数のようです。

前もって感謝します。

4

1 に答える 1

0

本当にstaticよろしいですか?

つまり、よりクラスに依存する言語では、次のようになる可能性があります。

class Person {

    static people = 0;

    public name;
    public age;

    public Person (name, age) { this.name = name; this.age = age; Person::people += 1; }
    public sayName () { echo this.name; }

    static numPeople () { echo Person::people; }
}

次に、次のように言うかもしれません。

bob = new Person("Bob", 32);
bob.sayName(); // "Bob"
Person::numPeople(); // 1

機能が必要な場合はPerson::numPeople();、追加を止めるものは何もありませんObject.create.numPeople = function () {};

あなたが自問したいかもしれない質問は、「なぜ?」です。

次のような静的メソッドを呼び出そうとしていますか?

bob.constructor.numPeople();

もしそうなら、それを回避するより良い方法があると確信しています。たとえば、コンストラクターのプロトタイプを拡張すると、デフォルトで静的プロパティ/メソッドへのアクセスが提供されます。

var personObj = {
    sayName : function () { console.log(this.name); },
    sayAge : function () { console.log(this.age); }
};

var bob = Object.create(personObj, { name : "Bob", age : 32 });

これらは従来の継承に似た方法でアクセスされますが、各オブジェクトが同じ関数と値を参照するという意味で静的です。したがって、そのプロトタイプ オブジェクトが変更されると、構築された各インスタンスも変更されます。

個人的には、オブジェクト作成の大部分をインラインおよびオンデマンドで自由に行える方が好きです。複数の同じ形式を作成する必要がある場合は、通常、コンストラクターを作成したり Object.create を使用したりするのではなく、ファクトリを作成します。

単純なファクトリでも、1 つまたは 2 つのレベルのクロージャを使用して、プライベート プロパティ/メソッドをシミュレートできます。

于 2012-09-20T01:38:51.823 に答える