Есть ли стандартный способ для Javascript классов ссылаться друг на друга? - PullRequest
0 голосов
/ 29 мая 2020

Мне было интересно, существует ли стандартный способ для свойств и методов класса ссылаться друг на друга в их объявлении? Например:

class A {
  methodA(){
    b.methodB()
    ...
  }
}

class B {
  methodB(){...}
}

const a = new A();
const b = new B(); 

///will throw ReferenceError: Cannot access 'b' before initialization;

Я понимаю, что вы можете добавить methodA позже, после всех объявлений класса / объекта, но он становится довольно неопрятным после многих повторений, что, как мне кажется, противоречит цели классов. Или что вы можете отложить ссылку каким-либо другим способом. Есть ли стандартный способ сделать это?

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Во-первых, Javascript не имеет "классов". Ключевое слово class используется только для того, чтобы вам было знакомо. Это должно было быть proto вместо class.

Лучше использовать mixins. Также это очень сильно зависит от того, следует ли распространять изменения в methodB на всех потомков A, или если вы этого хотите.

Без распространения - копирование

Если вам не нужно распространение и вам нужно скопировать множество методов:

const A = {
    name: 'I am A.'
}

const B = {
    name: 'I am B.', // this will overwrite A when we #assign. so be careful to assign it back
    methodB() {
        console.log(`${this.name} - foo`)
    }
}

const a = Object.create(A)

Object.assign(a, B)
a.name = A.name

// methodB is changed but it won't propagate.
B.methodB = function() {
    console.log(`${this.name} - bar`)
}

a.methodB() // I am A. - foo
B.methodB() // I am B. - bar

С распространением.

И если вам нужен только 1 или несколько методов:

const A = {
    name: 'I am A.'
}

const B = {
    name: 'I am B.',
    methodB() {
        console.log(`${this.name} - foo`)
    }
}

const a = Object.create(A)

a.methodA = function() {
    B.methodB.call(this)
}

B.methodB = function() {
    console.log(`${this.name} - bar`)
}

a.methodA() // I am A. - bar
B.methodB() // I am B. - bar
0 голосов
/ 29 мая 2020

Что ж, вы всегда можете создать экземпляр другого classes в своем классе, например A, и получить доступ к их методам и свойствам, как это.

class A {
  methodA(){
    const b = new B(); 
    b.methodB()
  }
}

class B {
  methodB(){console.log("Here I am")}
}

const a = new A();
a.methodA();

Или, вы можете использовать inheritance.

class A {}
class B extends A{
 constructor() { super(); //}
}
...