如何在JavaScript中继承特定的原型方法?

问题描述 投票:1回答:2

我试图找到答案,但很难找到一个好的答案。可能这个问题众所周知,但请帮帮我。我无法做到这一点:

function Animal() {}
function Cat() {}
Animal.prototype.walk = function() { return 'I can walk' }
Animal.prototype.swim = function() { return 'I can swim' }

如果我写:

Cat.prototype = new Animal(); 

猫继承了步行和游泳的方法,所以我应该写什么才能使猫只继承步行方法?

javascript inheritance prototype
2个回答
1
投票

您可以为原型对象(* .prototype)分配另一个Object Literal({}),但要小心继承不再正常工作:

function Person() {}

Person.prototype.walk = function() { return 'I can walk' }
Person.prototype.swim = function() { return 'I can swim' }

function Man() {}

// select methods Man gets inherited here
// just assign certain methods from Person.prototype onto Man.prototype
// therefore Man.prototype inherites only walk method
Man.prototype = {
  walk: Person.prototype.walk,
  // so swim is not passed onto Man.prototype
  // swim: Person.prototype.swim
};

var m = new Man();

// this throws an error 
// because a object of type Man does not have got a swim method inherited
// m.swim(); Error!

console.log('is false: ', m instanceof Person);
console.log('parent constructor is Object: ', m.__proto__.__proto__.constructor);

但是正如你可以看到一些检查以确定这个对象是什么实例以及它继承了一些方法的超级父构造函数不能正常工作但它们应该工作。

因此,以正确的方式使用继承会让您感觉更好:

function Person() {}

Person.prototype.walk = function() { return 'I can walk' }
Person.prototype.swim = function() { return 'I can swim' }

function Man() {}

Man.prototype = Object.create(Person.prototype);

var m = new Man();

// in this way Person gets every method that is assigned onto Person.prototype 
// so swim method is available and can be used by objects of type Man now:
m.swim();

console.log('is true: ', m instanceof Person);
console.log('parent constructor is Person: ', m.__proto__.__proto__.constructor);

因此,像instanceof运算符和引用超级父构造函数一样正常工作。通过这种方式,所有方法都会立即分配到Person上,但通过引入其他抽象或父构造函数,这可能是可以避免的。

希望这可以帮助。


0
投票

我认为主要的问题不是如何使猫继承行走而不是摆动:我认为这在你展示的方式中是不可能的,但这里的问题是对继承层次结构的不完全理解。

看,基本上你说的是:猫是动物,所以没有继承所有动物的行为是没有意义的。因为如果你说:动物被定义为可以行走和摇摆的人,然后你说:猫是一种动物,那么猫必须走路和摇摆。

我认为在您的情况下,您需要重新组织层次结构。也许你可以制作一个LandAnimal,一个WaterAnimal,一个Cat将是一个LandAnimal,一个Fish将是一个WaterAnimal。现在,如果你添加一个Duck,那么,你必须重新定义,因为Duck是一个WaterAnimal(他可以SWING)和一个LandAnimal(他可以WALK)。

© www.soinside.com 2019 - 2024. All rights reserved.