Mozilla Dev Network で Function.Prototype.call の例を使用する: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
引数配列の代わりにオブジェクト リテラルを渡すと、この例が機能しないのはなぜですか? この例では、名前と価格を Product プロトタイプに割り当て、対応する名前と価格のフィールドを持つ食品とおもちゃのオブジェクトを返す必要がありますが、結果は未定義で返されます。
function Product(data) {
this.name = data.name;
this.price = data.price;
if (price < 0)
throw RangeError('Cannot create product "' + name + '" with a negative price');
return this;
}
function Food(data) {
Product.call(this,data);
this.category = 'food';
}
Food.prototype = new Product();
function Toy(data) {
Product.call(this,data);
this.category = 'toy';
}
Toy.prototype = new Product();
var cheese = new Food({ name: 'feta', price: 5 });
var fun = new Toy({ name: 'robot', price: 40 });
console.log(cheese);
console.log(fun);
クロムでは、呼び出し関数が製品への参照を渡した後、「Uncaught TypeError: 未定義のプロパティ 'name' を読み取ることができません」というエラーが発生します。