8

私はjavascriptガーデンhttp://bonsaiden.github.com/JavaScript-Garden/ でjavascriptのプロトタイプについて読んでいましたが、その例の1つは次のようになります。

function Foo() {
    this.value = 42;
}
Foo.prototype = {
    method: function() {}
};

function Bar() {}

// Set Bar's prototype to a new instance of Foo
Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';

// Make sure to list Bar as the actual constructor <-------------------
Bar.prototype.constructor = Bar;

「Barを実際のコンストラクターとしてリストしてください」という行に注意してください。私はこれが何をするのか/何であるのか本当に迷っています。最後の行がある場合とない場合で、Bar()の新しいインスタンスを作成してみました。ただし、これらのインスタンスで「value」または「method」を呼び出すと、まったく同じものが返されます。だから私は、コンストラクターを指定する必要があるのだろうか(私はそれがなければならないと思います)?

ありがとうございました!!!

4

2 に答える 2

6

すべての関数にはprototypeプロパティがあり、関数オブジェクトの作成時に割り当てられ、から継承する新しく作成されたオブジェクトを指し、関数自体を指すプロパティObject.prototypeがあります。constructor

prototypeプロパティの目的は、コンストラクター関数を使用して継承を実装する方法を提供することです。演算子を使用して関数を呼び出すと、newそのコンストラクターのを継承する新しいオブジェクトが作成されますprototype

ここで、constructorプロパティの目的は、オブジェクトを作成したコンストラクターを参照する方法を用意することです。次に例を示します。

function Foo () {}
// default value of the property:
Foo.prototype.constructor == Foo; // true

このプロパティはの「インスタンス」によって継承さFooれるため、オブジェクトの作成に使用されたコンストラクターを知ることができます。

var foo = new Foo();
foo.constructor == Foo;

関数のプロトタイプに新しいオブジェクトを割り当てると、この関係は失われます。

function Bar () {}
Bar.prototype = { inherited: 1 };

Bar.prototype.constructor == Bar;    // false
Bar.prototype.constructor == Object; // true

また、関数のインスタンスにも影響します。

var bar = new Bar();
bar.constructor == Bar;    // false
bar.constructor == Object; // true

もう1つの同様のケースは、コンストラクターを使用して2つ以上のレベルの継承がある場合です。最も一般的な方法は、関数間の継承関係を示すために使用されprototype、2番目のレベルのプロパティを割り当てることです。

function Parent() {}

function Child () {}
Child.prototype = new Parent();

上記のコードにはいくつかの問題があります。まず、親コンストラクターのロジックを実行して継承関係を作成しますが、これは別の話です。上記の例では、オブジェクトconstructorを完全に置き換えるため、プロパティも影響を受けます。Child.prototype

var child = new Child();
child.constructor == Parent; // true

constructor割り当てた後にのプロパティの値をChild.prototypereplacereplaceすると、期待される動作が表示されます。

function Child() {}
Child.prototype = new Parent();
Child.prototype.constructor = Child;

var child = new Child();
child.constructor == Child; // true
于 2011-10-10T22:00:11.250 に答える
2

これは、新しいキーワードでBarをインスタンス化することと関係があると思います。newを使用すると、Bar.prototype.constructorが検索されると思います。その行の前では、Bar.prototype.contructorにリンクされているオブジェクトのタイプはFooであるため、その行なしでインスタンス化すると、BarオブジェクトではなくFooオブジェクトになります。

于 2011-10-10T21:56:31.270 に答える