[英]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.