如何避免继承

时间:2018-08-29 11:02:07

标签: javascript

我有一个几乎一直使用的名为a的对象。

然后'b'变得笨拙,在调用notify之前,我需要做其他一些事情。

获取同一对象的最佳功能/原型方法是什么?在面向对象的情况下称为父对象(据我了解,如果不使用Javascript类就无法实现-如果我错了,请纠正我)

let a = {};

a.notify = () => {
    doSomethingCool();
}

var b = Object.create(a);

b.notify = () => {
    doCoolStuffFirst();
    doSomethingCool();
}

3 个答案:

答案 0 :(得分:0)

不清楚您要问什么。您只是在寻找

const notify_orig = b.notify;
b.notify = () => {
    doCoolStuffFirst();
    notify_orig.call(b);
}

答案 1 :(得分:0)

正如您所说,使用类很容易:

class A {
  notify() {
    doSomethingCool();
  }
}

class B {
  notify() {
    doCoolStuffFirst();
    super.notify();
  }
}

如果没有ES6课程,您将遇到困难。 ES6编译器将super.notify()转换为类似的

_get(
   B.prototype.__proto__ ||
   Object.getPrototypeOf(B.prototype),
   "notify", this
).call(this);

_get是一种巨大的实用程序方法,用于平滑有关各种类型的值以及继承和填充的粗糙边缘)。这不是不可能,它太复杂了,您可能不想自己做。

答案 2 :(得分:0)

不使用__proto__class(ES6中的语法糖)。

function doSomethingCool() {
    console.log("something cool");
}

function doCoolStuffFirst() {
    console.log("cool stuff first");
}

let a = {};
a.notify = () => {
    doSomethingCool();
}
a.notify();

let b = Object.create(a)
b.notify = (() => {
    let notifySuper = b.notify; // reference to the 'super' method
    return () => {
        doCoolStuffFirst();
        notifySuper();
    }
})();
b.notify();