5

JavaScript では、すべての関数のプロトタイプ オブジェクトにはconstructor、関数を指す列挙不可能なプロパティがあります ( EcmaScript §13.2 )。ネイティブ機能では使用されませんが (たとえばinstanceof、プロトタイプ チェーンのみをチェックします)、継承のために関数のプロパティを上書きする場合は調整することをお勧めします。prototype

SubClass.prototype = Object.create(SuperClass.prototype, {
    constructor: {value:SubClass, writable:true, configurable:true}
});

しかし、私たち (私を含む) は、明快さと簡潔さのためだけにそれを行うのでしょうか? constructorプロパティに依存する実際のユースケースはありますか?

4

2 に答える 2

2

constructorプロパティがJSである理由がよくわかりません。私はときどき、IE < 9 でオブジェクト (Event オブジェクトなど) のプロトタイプを作成するためにそれを使用していることに気づきます。

function Foo()
{
    this.name = 'Foo';
}
function Bar()
{
    this.name = 'Bar';
}
function Foobar(){};
Foo.prototype = new Foobar;
Foo.prototype.constructor = Foo;
Bar.prototype = new Foobar;
Bar.prototype.constructor = Bar;
var foo = new Foo();
var bar = new Bar();
//so far the set-up
function pseudoOverload(obj)
{
    if (!(obj instanceof Foobar))
    {
        throw new Error 'I only take subclasses of Foobar';
    }
    if (obj.constructor.name === 'Foo')
    {
        return new obj.constructor;//reference to constructor is quite handy
    }
    //do stuff with Bar instance
}

私の知る限り、コンストラクタープロパティの「利点」は次のとおりです。

  • インスタンスから新しいオブジェクトを簡単にインスタンス化する
  • オブジェクトを特定のクラスのサブクラスとしてグループ化できますが、扱っているサブクラスの特定のタイプを確認することもできます。
  • あなたが言うように:きちんとしていること。
于 2012-09-27T14:17:37.207 に答える
0

私の理解コンストラクタープロパティは、特定のオブジェクトがどの機能コンストラクターによって作成または構築されているかを確認するために使用されます。

これは同じ例です: http://www.klauskomenda.com/code/javascript-inheritance-by-example/

于 2012-09-27T13:11:30.003 に答える