Js - 使用对象创建函数的原型继承

时间:2017-11-25 13:53:10

标签: javascript prototype javascript-objects

我想知道为什么在这段代码中,当我尝试访问构成garfield的对象的属性时,在这种情况下Cat,我得到{{1 }}:

undefined

我是否能够让原型继承链获得对这些属性的访问?

2 个答案:

答案 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);