【问题标题】:Access parent (super) method in object created by Object.create访问由 Object.create 创建的对象中的父(超级)方法
【发布时间】:2019-03-08 18:55:08
【问题描述】:

我想创建一个包装器机制:我们包装c,所以新对象w 有自己的属性和方法,但c 也可以访问。

// Note: this class might be from an external lib
class C {
  f() {
    console.log('f (original)');
    this.p = 'p';
  }
}

class W {
  f() {
    console.log('f (new)');
    super.f();  // TypeError: (intermediate value).f is not a function
    console.log(this.p);
  }
}

// Note: this value is external for us
const c = new C();

const w = Object.create(null, Object.getOwnPropertyDescriptors(W.prototype));
Object.setPrototypeOf(w, c);

w.f();  // expected:
        // f (new)
        // f (original)
        // p

我这样做是否正确?

为什么会发生错误?

更新:P.S.我确实知道我可以使用组合,但我想了解错误的来源。

【问题讨论】:

  • 可能是 stackoverflow.com/questions/2107556/… 的副本 ...在那里阅读它,它可能会解决您的问题。
  • @gugateider 谢谢但抱歉,我没有看到答案
  • 你想包装什么obj?您发布的代码中没有obj 变量。
  • 看看thisthat
  • 更新:P.S.我确实知道我可以使用组合,但我想了解错误的来源。

标签: javascript oop inheritance ecmascript-6 super


【解决方案1】:

为什么会发生错误?

因为使用superW.prototype.f 方法只关心W.prototype 的原型来评估super 将引用什么。 super 关键字本质上是静态查找,取决于声明方法的对象,忽略调用方法的对象的原型链。

如果我们translate

class W {
  f() {
    console.log('f (new)');
    Object.getPrototypeOf(W.prototype).f.call(this); // TypeError: (intermediate value).f is not a function
    console.log(this.p);
  }
}

我们可以看到Object.prototype.f不是一个函数……


因此,您可以通过 Object.setPrototypeOf(W.prototype, C.prototype) 而不是 Object.setPrototypeOf(w, c)(或 w = Object.create(c, …))来解决此问题,但我不建议这样做。如果你真的想影响所有实例,你应该已经写了class W extends C(这与使用Object.setPrototypeOf(W.prototype, C.prototype)的结果相同)。

【讨论】:

  • 啊,我忘记了f 不是W.f 而是W.prototype.f...现在我看到了链条!非常感谢! :)
【解决方案2】:

您想使用extends 关键字,例如:

    class C {
        f() { console.log( "C.f" ); }
    }

    class W extends C {
        f() {
            super.f()
            console.log( "W.f" );
        }
    }

    const w = new W();
    w.f(); // will output C.f W.f

【讨论】:

  • 没有。对象c 是通过调用外部图书馆的函数给出的。在您的代码中无法访问它的属性。我们可以使用组合。但那是另一回事了……
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2015-10-21
  • 2014-07-04
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2013-07-01
相关资源
最近更新 更多