【问题标题】:Extend prototype function JavaScript扩展原型函数 JavaScript
【发布时间】:2015-07-18 18:40:03
【问题描述】:

我有一个继承自另一个对象的对象,如下所示:

var a = function ()
{

}
a.prototype.foo = function ()
{
    bar();
}

var b = function ()
{
    a.call(this)
}
b.prototype = Object.create(a.prototype);
b.prototype.constructor = b;

我想要一个 b 的方法,它也被命名为“foo”,并扩展了 a 的同名函数。

b.prototype.foo = function ()
{
    baz();
    // When .foo() is called, runs both bar() and baz()
}

有没有一种简单的方法可以在原生 JavaScript 中不借助库来实现这一点?

【问题讨论】:

    标签: javascript inheritance prototype


    【解决方案1】:

    如果我理解正确,你可以扩展方法

    function A() {}
    
    A.prototype.foo = function() {
        console.log('foo');
    };
    
    function B() {}
    
    B.prototype = Object.create(A.prototype);
    B.prototype.constructor = B;
    B.prototype.foo = function() {
      A.prototype.foo.call(this);
      console.log('foo2');
    }
    
    var b = new B();
    
    b.foo();

    【讨论】:

      【解决方案2】:

      最简单的选择:

      b.prototype.foo = function () {
          bar();
          baz();
      }
      

      但如果您对a.prototype.foo 进行更改,则需要使用相同的逻辑更新b.prototype.foo

      更好的选择是:

      b.prototype.foo = function () {
          a.prototype.foo.call(this); 
          baz();
      }
      

      现在b.prototype.foo() 调用a.prototype.foo() 后跟它自己的内部逻辑。如果您更改 a.prototype.foo(),这些更改将立即反映在 b.prototype.foo() 的行为中,而无需进行更广泛的重构。

      【讨论】:

      • 这种情况总是会发生。 @Georgii Kats 刚刚用第二种解决方案击败了我,所以如果你正在寻找它,请确保他得到官方答案:)
      猜你喜欢
      • 1970-01-01
      • 2021-01-27
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      相关资源
      最近更新 更多