JavaScript的继承和原型

时间:2018-11-01 11:14:13

标签: javascript

我们可以通过将对象分配给Object.prototype属性来为JavaScript中的对象创建原型。

function Animal() { };

Animal.prototype = {
  constructor: Animal,
  describe: function() {
    console.log("This is an animal");
  },
  eat: function() {
    console.log('Eating');
  }
};

如果要向对象添加更多属性,则可以在派生对象(子对象)中以以下方式进行操作:

function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;


Dog.prototype.bark = function() {
  console.log('barking');
}
Dog.prototype.guard = function() {
  console.log('guarding');
}
Dog.prototype.eat = function() {
  console.log('Dog is Eating');
}

let tipu = Object.create(Dog.prototype);
tipu.bark();
tipu.guard();
tipu.eat();

但是,如果我不想每次都重复Dog.prototype,该怎么办。我想像对父动物(Animal.prototype = {...}一样)为子对象(下面的大象对象)的prototype属性分配一个对象。

function Elephant() { }
Elephant.prototype = Object.create(Animal.prototype);
Elephant.prototype.constructor = Elephant;

Elephant.prototype = {
  play : function() {
    console.log("Playing in the jungle");
  },
  eat : function() {
    console.log("Elephant is eating");
  }
}

let hathi = new Elephant();
hathi.eat();
hathi.play();

现在,当我这样做时,它会从子级中删除父级的describe()方法。

hathi.describe();

这将引发错误,但是tipu.describe();可以正常工作。

我做错什么了吗?

1 个答案:

答案 0 :(得分:0)

  

但是,如果我不想每次都重复Dog.prototype,该怎么办。我想为原型分配一个对象

然后做。

function Dog() {}
Dog.prototype = Object.assign(
    Object.create(Animal.prototype),
    {
        constructor: Dog,

        bark(){
            console.log('barking');
        },

        guard(){
            console.log('guarding');
        },

        eat(){
            console.log('Dog is Eating');
        }
    }
);

或者您可以看看3年前推出的全新class Syntax

class Dog extends Animal {
    bark(){
        console.log('barking');
    },

    guard(){
        console.log('guarding');
    },

    eat(){
        console.log('Dog is Eating');
    }
}