【发布时间】:2014-10-30 19:22:44
【问题描述】:
这里我有两个例子,它有两个构造函数Product 和Food。在我的第一个例子中,Food constrcutor 通过Food.prototype=new Product();从 Products 继承,当我 console.log 由 Food 构造函数创建的鸡肉对象显示它的属性时控制台:
Food {category: "food", name: newname, price: newprice}
代码如下:
<html>
<body>
<script>
function Product(name, price) {
this.name = name;
this.price =price;
}
function Food(name, price) {
this.category = 'food';
}
Food.prototype=new Product('newname','newprice');
var chicken = new Food('chicken','40');
console.log(chicken);
</script>
</body>
</html>
现在这是第二个示例,我删除了Food.prototype=new Products('newname,'newprice');,而是在 Food 构造函数中使用了Product.apply(this,arguments);。在控制台中它显示了相同的结果:
Food {name: "chicken", price: "40", category: "food"}
代码:
<html>
<body>
<script>
function Product(name, price) {
this.name = name;
this.price =price;
}
function Food(name, price) {
Product.apply(this,arguments);
this.category = 'food';
}
var chicken = new Food('chicken','40');
console.log(chicken);
</script>
</body>
</html>
让我感到困惑的是,在这两个例子中,鸡肉对象都有三个属性类别,名称和价格。虽然在第二个例子中,食物不是从产品继承的。我的意思是产品不在食物的原型链上。那么有什么区别两者之间??什么时候使用??我对面向对象的概念还很陌生。所以详细的解释会很棒!!!
【问题讨论】:
-
它们不是排他的,一个像“super”,一个像“extends”。两者都需要,调用父构造函数继承属性,设置原型链。
-
如果我可以用一个做同样的事情,我为什么要使用另一个??
-
apply 方法不是继承而是用作回调..
-
chicken不会从Product的原型继承任何东西,你需要两者。 -
是的,来自构造函数的属性,没有来自原型。这根本不是继承,它只是调用具有
this值的函数,并且由于new返回一个对象的实例,所以你得到的只是一个具有这些属性的对象。这两个对象仍然不相关。
标签: javascript