我想知道为什么在这段代码中,当我尝试访问构成garfield
的对象的属性时,在这种情况下Cat
,我得到{{1 }}:
undefined
我是否能够让原型继承链获得对这些属性的访问?
答案 0 :(得分:3)
单词OOP
包含" object"在其定义中;这意味着你正在处理对象。
Javascript做了一些特别的事情,它直接暴露了对象,你可以在没有抽象的情况下使用它们(没有类)。
要创建对象,您只需使用{}
声明它即可。例如,无需像java
中那样创建一个类。
要直接使用继承,您需要拥有一个对象,并将其附加到其原型中。
以下是一个例子:
const Cat = {
legs: 2,
species: 'cat',
};
Object.setPrototypeOf(Cat, {
makeSound() {
console.log(this.sound); // logs undefined
}
})
const garfield = Object.create(Cat);
garfield.sound = 'feed me';
garfield.makeSound();
console.log(garfield.legs) //2

要使用函数继承,您必须首先构造函数以使对象脱离函数(this
)并且原型将自动附加到this
对象
function Cat(){
this.legs = 2;
this.species = 'cat';
};
Cat.prototype.makeSound = function() {
console.log(this.sound); // logs undefined
};
const garfield = new Cat();
garfield.sound = 'feed me';
garfield.makeSound();
console.log(garfield.legs) // 2

答案 1 :(得分:2)
在您的示例中Object.create 不创建该类的新实例!它创建了一个函数(因为Cat
是一个函数,你传递函数的原型)!
使用new
创建新实例
const garfield = new Cat();
console.log(garfield.legs);
或
function GarfieldLikeCat() {}
GarfieldLikeCat.prototype = Object.create(Cat.prototype);
GarfieldLikeCat.prototype.constructor = GarfieldLikeCat;
获得经典继承(不是新实例!)。
如果您没有使用this.legs = 2;
,而是Cat.prototype.legs = 2;
,则可以使用Object.create
创建新实例
function Cat() {}
Cat.prototype.legs = 2;
const garfield = Object.create(Cat.prototype);
console.log(garfield.legs);