【问题标题】:How to access a method from a class from another class?如何从另一个类访问一个类的方法?
【发布时间】:2017-01-03 16:40:10
【问题描述】:

我想在 JavaScript 中使用面向对象的编程技术,但我无法从一个类访问另一个类的方法。怎么能像下面这样呢?

class one{

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

class two{
   var object=new one();

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

我收到以下错误:

Uncaught SyntaxError: Unexpected identifier -->> for var object=new one();

【问题讨论】:

  • 你不能直接在类中声明变量。 var object = new one(); 是语法错误。
  • @Barmar 我明白了,我是 Javascript 新手 ;)

标签: javascript oop


【解决方案1】:

您的语法不合法。您的控制台中应该有一个错误,显示哪行代码不正确。

如果是静态方法(不使用任何实例数据),则声明为静态方法,直接调用即可。

如果它是一个实例方法,那么您通常会创建一个 one 类型的对象,然后在该对象上调用该方法(通常在构造函数中)。

使方法静态(在您的特定情况下似乎没问题):

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

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

对于非静态情况,您没有正确的语法。看来您想在 Two 的构造函数中创建 One 对象的实例,如下所示:

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

【讨论】:

  • 他用一个对象来调用它,object.write()。为什么它需要是静态的?
  • @Barmar - 我的回答清楚地解释了他可以采用静态或非静态方式,具体取决于该方法是否使用实例数据。他的方法不访问任何实例数据,所以我展示了静态方法。我还添加了一个更正的非静态示例(OP 有错误)。
  • @Barmar - 我为非静态情况添加了一个更正的示例。
  • @jfriend00 这对我有用,谢谢。我想问一个问题他们为什么否定我的问题,我哪里做错了?
  • @AnthonyWinzlet - 请阅读一些关于“面向对象编程”的参考资料。类构成了您可以创建和使用的对象的定义。面向对象编程有数百种用途和优势,包括数百本关于该主题的书籍。对此进行详细介绍超出了此处的评论范围,并且互联网上有数千篇文章参考。你可以从this one开始。
【解决方案2】:

我建议做的不是将课程紧密联系在一起,而是做这样的事情......

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;
  });
});

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多