【问题标题】:How to inherit specific prototype method in JavaScript?如何在 JavaScript 中继承特定的原型方法?
【发布时间】:2015-08-29 16:10:58
【问题描述】:

我试图找到答案,但很难找到一个好的答案。 可能这个问题是众所周知的,但请帮助我。 我无法完成这项工作:

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方法呢?

【问题讨论】:

  • 所以猫不会游泳?在这种情况下,为什么要在Animal 中添加swim 方法?您的原型定义错误。

标签: javascript inheritance prototype


【解决方案1】:

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

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

希望这会有所帮助。

【讨论】:

  • 虽然我确实认为您的回答很有价值并且信息量很大,但我觉得它没有回答问题。
  • 我扩展了我的答案,它并没有那么清楚,谢谢 gion_13 :)
【解决方案2】:

我认为主要问题不是如何让那只猫继承walk而不是swing:我认为你展示的方式是不可能的,但这里的问题是对继承层次结构的理解不完整。

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

我认为在您的情况下,您需要重新组织层次结构。也许你可以制作陆地动物和水动物,猫将成为陆地动物,鱼将成为水动物。现在,如果您添加一只鸭子,那么您必须再次重新定义,因为鸭子是水生动物(他可以摆动)和陆地动物(他可以走路)。

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 2016-07-29
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2010-09-28
    • 2010-09-28
    相关资源
    最近更新 更多