【问题标题】:How to make JavaScript function inheritance work right如何使 JavaScript 函数继承正常工作
【发布时间】:2012-11-18 02:28:48
【问题描述】:

我有一个问题。我正在开发一个相当大的 JavaScript 项目,并且正在学习如何使用 OOP。我相信你知道,这在 JS 中有点奇怪。

这就是我想要做的:我有一个基础“类”,我称之为AbstractAnimal。我还有另一门课叫Animals。在Animals 类中,我有三个组,分别称为ManMonkeyElephant。我希望这些组中的每一个都继承AbstractAnimal,但要成为自己的功能,而不是连接到AbstractAnimal

我最初是这样做的:

Animals.prototype.Man = AbstractAnimal;
Animals.prototype.Monkey = AbstractAnimal; //etc...

但是,遗憾的是,这并不能满足我的需要。原因如下:

AbstractAnimal.prototype.clicked = function() { console.log("clicked") };
//If I change Man...
animals.Man.clicked = function() { console.log("HA!"); };
//Monkey is effected too...
animals.Monkey.clicked();
//Console: "HA!"

在上面的例子中,当 Monkey 被点击时,我希望控制台说“点击”。当点击 Man 时,它应该说“HA!”。

所以我发现了一些我认为可以在这里做的事情:javascript class inherit from Function class

它几乎奏效了,但并不完全奏效。这是一个简化的测试用例:http://jsfiddle.net/9KRJk/2/

能帮帮我吗?谢谢!

附:不,实际上,整个动物都是隐喻的,我实际上并不是在为动物园编程。 :)

【问题讨论】:

    标签: javascript oop inheritance


    【解决方案1】:

    不知道我是否完全理解你的问题,但也许你把事情复杂化了或者你错过了一些概念,但是你的原型链可以这样表示:

    // Extends helper
    Function.prototype.extends = function( parent ) {
      this.prototype = Object.create( parent.prototype );
    };
    
    function Animal() {}
    Animal.prototype = {
      clicked: function() {
        console.log('animal');
      }
    };
    
    function Man() {}
    Man.extends( Animal );
    Man.prototype.clicked = function() {
      console.log('man');
    };
    
    function Monkey() {}
    Monkey.extends( Animal );
    Monkey.prototype.clicked = function() {
      console.log('monkey');
    };
    
    var animal = new Animal();
    animal.clicked(); //=> 'animal'
    
    var man = new Man();
    man.clicked(); //=> 'man'
    
    var monkey = new Monkey();
    monkey.clicked(); //=> 'monkey'
    

    【讨论】:

    • 嘿,谢谢!这不是我所需要的,但它给了我需要的方向。我的代码现在更干净了!对于未来的人,这也帮我找到了答案:bennadel.com/blog/…
    猜你喜欢
    • 2011-11-24
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多