Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从另一个类访问一个类中的方法?_Javascript_Oop - Fatal编程技术网

Javascript 如何从另一个类访问一个类中的方法?

Javascript 如何从另一个类访问一个类中的方法?,javascript,oop,Javascript,Oop,我想在JavaScript中使用面向对象编程技术,但我无法从一个类访问另一个类的方法。怎样才能做到像下面这样 class one{ write(){ console.log("Yes! I did!"); } } class two{ var object=new one(); tryingMethod(){ object.write(); } } 我得到以下错误: 未捕获的SyntaxError:var object=new one()的意外标识

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

class one{

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

class two{
   var object=new one();

   tryingMethod(){
   object.write();
   }
}
我得到以下错误:

未捕获的SyntaxError:
var object=new one()的意外标识符-->>


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

如果它是静态方法(不使用任何实例数据),那么将其声明为静态方法,您可以直接调用它

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

要使该方法成为静态的(在您的特定情况下,这似乎很好):

对于非静态情况,您没有正确的语法。您似乎希望在
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
,我建议不要将类紧密地捆绑在一起,这样做

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

他用一个对象调用它,
object.write()
。为什么它需要是静态的?@Barmar-我的回答清楚地解释了他可以选择静态的或非静态的,这取决于方法是否使用实例数据。他的方法不访问任何实例数据,所以我展示了静态方法。我还添加了一个已更正的非静态示例(OP有错误)。@Barmar-我为非静态示例添加了一个已更正的示例。@jfriend00这对我很有用,谢谢。我想问一个问题,为什么他们会否定我的问题,我哪里做错了?@AnthonyWinzlet-请阅读一些关于“面向对象编程”的参考资料。类构成可以创建和使用的对象的定义。面向对象编程有数百种用途和优点,包括数百本关于该主题的书籍。关于这一点的详细讨论超出了这里的评论范围,互联网上有数千篇文章引用。可以从开始。不能直接在类中声明变量<代码>变量对象=新对象()
是一个语法错误。@Barmar我明白,我是Javascript新手;)
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;
  });
});