Как получить доступ к методу из класса из другого класса?

Я хочу использовать технику объектно-ориентированного программирования с JavaScript, но не могу получить доступ к методу из одного класса из другого класса. Как можно сделать, как следующее?

class one{

  write(){
    console.log("Yes! I did!");
  }
}

class two{
   var object=new one();

   tryingMethod(){
   object.write();
   }
}

Я получаю следующую ошибку:

Uncaught SyntaxError: неожиданный идентификатор ->> для var object=new one();

3 ответа

Решение

Ваш синтаксис не является законным. В вашей консоли должна быть ошибка, показывающая, какая строка кода неверна.

Если это статический метод (не использует данные экземпляра), тогда объявите его как статический метод, и вы можете напрямую вызывать его.

Если это метод экземпляра, то вы обычно создаете объект типа one а затем вызвать метод для этого объекта (обычно в конструкторе).

Чтобы сделать метод статичным (что в вашем конкретном случае выглядит нормально):

class One {
  static write(){
    console.log("Yes! I did!");
  }
}

class Two {
   tryingMethod(){
     One.write();
   }
}

Для нестатического случая у вас нет правильного синтаксиса. Похоже, вы хотите создать экземпляр One объект в конструкторе для Two как это:

class One {
  write(){
    console.log("Yes! I did!");
  }
}

class Two {
   constructor() {
       this.one = new One();
   }

   tryingMethod(){
     this.one.write();
   }
}

var x = new Two();
x.tryingMethod();

Примечание: я также придерживаюсь общепринятого соглашения Javascript об использовании идентификатора, который начинается с заглавной буквы для имени класса / конструктора, такого как One вместо one,

Я бы порекомендовал не связывать классы так тесно и делать что-то вроде этого...

class One {
  write() {
    console.log("Yes! I did!");
  }
}

class Two {
  constructor(one = new One())  {
    this.one = one;
  }
  tryingMethod() {
    this.one.write();
  }
}

Теперь, что вы можете сделать, это...

const two = new Two();
two.write();

Это позволяет лучше разделить проблемы и упростить юнит-тестирование Two класс, потому что вы можете передать в фиктивную реализацию One класс, если хотите.

describe("two class", () => {
  it("should do something", () => {
    const one = {
      write: sinon.spy()
    };
    const two = new Two(one)

    two.tryingMethod();

    expect(one.write.calledOnce).to.be.ok;
  });
});

Вы можете упаковать зависимости в контейнер.

      class Provider {
    private _one?: One;
    private _two?: Two;

    one(): One {
        return this._one || (this._one = new One(this));
    }

    two(): Two {
        return this._two || (this._two = new Two(this));
    }
}


class One {
    constructor(private provider: Provider) { }

    write() {
        console.log("Yes! I did!");
    }
}

class Two {
    constructor(private provider: Provider) { }

    tryingMethod() {
        this.provider.one().write();
    }
}
Другие вопросы по тегам