在下面的代码中,orange
的构造函数记录为其父构造函数(Plant()
),而不是Fruit()
。为什么会这样?
(对于随机对象感到抱歉。这是半夜,我只是在学习一些JavaScript。在现实世界中没有想太多关于它们的意义,只需将它们作为样本输入来理解原型更好。)
function Plant(name, colour) {
this.name = name;
this.colour = colour;
}
Plant.prototype.print = function () {
return "I'm a " + this.name.toLowerCase() + " and I'm " + this.colour.toLowerCase() + ".";
}
var mango = new Plant("Mango", "Orange");
console.log(mango.constructor);
function Fruit(type, isOrganic) {
this.type = type;
this.isOrganic = isOrganic;
}
Fruit.prototype = new Plant("Orange", "Orange");
var orange = new Fruit("staples", true);
console.log(orange.constructor);
我为两个console.log()调用得到Plant(name, colour)
,而我认为我应该为第二个调用得到Fruit(type,isOrganic)。我在做什么/理解不正确?
更新:与上述内容一致,如果我执行以下操作...
Fruit.prototype = {
hello: "World"
};
...而不是我在上面的示例中所做的,我得Object()
作为对象的构造函数,即使我使用new Fruit()
创建它。
为什么对象的构造函数属性包含用于构建它而不是最新版本的谱系中最旧的函数?
答案 0 :(得分:4)
JS是一种基于Prototype的语言。没有制作对象,并且其行为与面向对象语言中的行为完全不同。
这意味着当你打电话时......
Fruit.prototype = new Plant("Orange", "Orange");
您正在定义Fruit“类”(尽管没有类)与名称=>的植物完全相同“橙色”和颜色=> “橙子”。一切都被复制,包括构造函数。
除了所有水果现在都是橘子的问题,解决这个问题的一种方法是包括这条线......
function Fruit(type, isOrganic) {
this.type = type;
this.isOrganic = isOrganic;
}
Fruit.prototype = new Plant("Orange", "Orange");
Fruit.prototype.constructor = Fruit; // <--- Add this
这使得Fruit使用Fruit()函数作为构造函数。这也传递给用它构造的所有对象。