新しいオブジェクトを作成するときにプロトタイプ オブジェクトを選択できるメソッドがあります (「Javascript: The Good Parts」ブックからコピー)。
Object.create = function(o) {
var F = function() {};
F.prototype=o;
return new F();
}
さて、私はオブジェクトを持っているとしましょう:
var car = {
model: "Nissan"
};
そして、"Create" メソッドを使用して、このオブジェクトに基づいて新しいオブジェクトを作成します。
var car1 = Object.create(car);
次に、car にプロパティを追加すると、car1 に動的に追加されます (動的プロトタイピング)。たとえば、次のようになります。
car.year=2011; // Gets added to "car"...
alert(car1.year); // ... Is also avaialable to car1
Q1) この動作は、car のプロトタイプに「年」が追加されたことを示しています。これが car1 で使用できる理由です。これは正しいです?そうでない場合、「年」はどこに追加され、「車」と「車 1」の両方で使用できるのはなぜですか?
また、委譲の規則に従って、メソッドがオブジェクトで見つからない場合、そのプロトタイプを検索し、Object.prototype に到達するまでチェーンのすべてのプロトタイプをチェックします。したがって、次のように入力すると、次のようになります。
Object.prototype.originCountry = "Japan";
alert(car.originCountry); // Outputs Japan
alert(car1.originCountry); // Outputs Japan
ここまでは順調ですね; ただし、そうする場合:
Object.carColor= "White";
alert(car.carColor); // Error!
Q2) 「車」にプロパティを追加すると (上記のcar.yearの例を参照)、車のプロトタイプに追加されます。ただし、オブジェクトにプロパティを追加すると、オブジェクトのプロトタイプに追加されませんか? 追加される場合Object のプロトタイプに、なぜ委任のルールに従って「車」に利用できないのですか?
なぜこうなった?