gpt4 book ai didi

javascript - 尝试了解 JavaScript 中的继承——这里发生了什么?

转载 作者:行者123 更新时间:2023-11-28 13:43:12 24 4
gpt4 key购买 nike

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

// 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/

最佳答案

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

是的,但是对于 Animal 构造函数(或者准确地说:对于从该函数对象继承的新对象 - 检查 docs for Object.create )。这几乎不是您想要的 - 并解释了您说“动物”的奇怪结果,因为那是动物function's name property .

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

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

此外,对于原型(prototype)继承,您应该在原型(prototype)对象上使用 sayNamesayType 方法(并且仅一次):

Animal.prototype.sayType = function() {
alert(this.type);
};
Cat.prototype.sayName = function() { // after creation of that object, of course
alert(this.name);
};

关于javascript - 尝试了解 JavaScript 中的继承——这里发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16346436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com