0

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' を読み取ることができません」というエラーが発生します。

4

1 に答える 1

0

問題はここにあります:

Food.prototype = new Product();
// ...
Toy.prototype = new Product();

Product引数を渡さずに呼び出しています。Object.create代わりに使用する必要があります。

Foo.prototype = Object.create(Product.prototype);
// ...
Toy.prototype = Object.create(Product.prototype);

これにより、コンストラクター関数を呼び出すことなく、別のオブジェクト(Product.prototypeこの場合)から継承するオブジェクトを作成できます。


また、これ:

if (price < 0)

これである必要があります:

if (this.price < 0)
于 2013-08-28T00:21:10.337 に答える