繁体   English   中英

为什么JavaScript的.call函数不能与对象文字一起使用?

[英]Why doesn't JavaScript's .call function work with object literals?

在Mozilla开发人员网络上使用Function.Prototype.call示例: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

在传递对象文字而不是参数数组时,为什么该示例不起作用? 该示例应将名称和价格分配给Product原型,并返回带有相应名称和价格字段的Food和Toy对象,但返回的结果不确定。

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);

在Chrome浏览器中,调用函数传递了对产品的引用后,出现“未捕获的TypeError:无法读取未定义的属性'名称'”错误。

问题在这里:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM