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

时间:2015-08-29 16:10:58

标签: javascript inheritance prototype

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

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

如果我写:

Cat.prototype = new Animal(); 

Cat继承了walk和swim方法,所以我应该写什么才能让Cat继承只有walk方法?

2 个答案:

答案 0 :(得分: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);

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

所以你最好以正确的方式使用inheritage:

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上,但通过引入其他抽象或父构造函数,这可能是可以避免的。

希望这有帮助。

答案 1 :(得分:0)

我认为主要问题不是如何让那只猫继承行走而不摆动:我认为这不可能,但是这里的问题是对继承层次结构的不完全了解。

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

我认为在您的情况下,您需要重新组织层次结构。也许您可以制作LandAnimal和WaterAnimal,而Cat将成为LandAnimal,而Fish将成为WaterAnimal。现在,如果您添加了鸭子,那么您又需要重新定义,因为鸭子是WaterAnimal(他可以摆动)和LandAnimal(他可以走路)。