0

为什么这里说“动物”而不是“小猫”?

// create base class Animal
function Animal(animalType) {
    this.type = animalType;
    this.sayType = function () {
        alert(this.type);
    };
}

// create derived class Cat
function Cat(myName) {
    Animal.call(this, "cat"); // cat calls the Animal base class constructor

    this.name = myName;

    this.sayName = function () {
        alert(this.name);
    };
}

Cat.prototype = Object.create(Animal); // set Cat's prototype to Animal

// instantiate a new instance of Cat
var cat = new Cat("kitty");

cat.sayName();
cat.name = "lol";
cat.sayName();

http://jsfiddle.net/dgcoffman/MguUA/5/

4

2 回答 2

4
Object.create(Animal); // set Cat's prototype to Animal

是的,但是对于Animal构造函数(或者,确切地说:对于从该函数对象继承的新对象 - 检查文档Object.create)。这几乎不是你想要的 - 并解释了你说的奇怪结果"Animal",因为那是Animal 函数的name属性

相反,您想构建一个原型链,以便 cat 实例继承自Cat.prototypewhich 继承自Animal.prototype(继承自Object.prototype):

Cat.prototype = Object.create(Animal.prototype);

此外,对于原型继承,您应该使用原型对象上的sayNameandsayType方法(并且只有一次):

Animal.prototype.sayType = function() {
    alert(this.type);
};
Cat.prototype.sayName = function() { // after creation of that object, of course
    alert(this.name);
};
于 2013-05-02T19:56:32.680 回答
1

你打电话Object.create()的方式与我打赌你认为的不同。试试这个改变:

Cat.prototype = Object.create(new Animal);

Object.create()函数期望它的第一个参数是用作返回对象原型的对象当您传入函数名称“Animal”时,这意味着您希望原型对象是该函数对象,而不是由该函数构造的对象。

编辑——Bergi 的回答涉及直接使用 Animal 原型可能更有意义,尽管从你发布的内容来看,没有一个 Animal 原型对象上有任何有趣的东西。也许这在您的代码中的其他地方,或者稍后会添加。无论如何,如果它确实存在,最好按照他的回答做。

由于您的“Cat”构造函数直接从 Animal 构造函数中获取“sayType”属性,因此不清楚您要通过设置 Cat 原型来做什么。

于 2013-05-02T19:52:14.517 回答