如何将构造函数作为对象调用时使其具有可访问的成员

时间:2018-11-05 01:58:19

标签: javascript ecmascript-6

我可以使用JavaScript做到这一点:

var output = String(result);

我可以对使用String引用的同一对象执行此操作:

var character = String.fromCharCode(10);

String可以用作构造对象的函数, 可以在其上调用成员,而无需将其用作构造函数。如何使对象在这两种方式下都可用?这叫什么?

3 个答案:

答案 0 :(得分:1)

您正在谈论类方法。

function Foo() {
  this.bar = 3
}

Foo.baz = function() {
  console.log('hi');
}

或在ES 2015中

class Foo {
  static baz () {
    console.log('hi');
  }
}  

回复评论

可以在构造函数中定义静态方法,因为构造函数必须在范围内:

function Foo() {
  Foo.method = function () {
    // do stuff
  }
}

这种方法有两个问题:

Foo.method('stringy string'); // TypeError: cannot read property 'method' of undefined

由于静态方法是在构造函数中定义的,因此直到构造函数至少运行一次之后,该方法才会存在:

const foo = new Foo();
Foo.method('stringy string'); // now we're good

导致另一个问题,现在每次构造函数运行时,我们都在浪费精力重新分配该方法。您可以通过条件检查来避免这种情况:

function Foo() {
  if (!Foo.method) Foo.method = function....
}

但这只是很多奇怪的事情,只是为了避免在构造函数之后定义类方法,而且仍然不能解决第一个问题。

答案 1 :(得分:0)

您可以使用静态方法创建类:

class Foo {
    constructor(bar) {
        this.bar = bar;
    }

    length() {
        return this.bar.length;
    }

    static fromThing(thing) {
        return new Foo(thing.bar);
    }
}

Foo.fromThing()类似于String.fromCharCode()

答案 2 :(得分:0)

简单

function MyClass () {
  this.val = 1;
}

MyClass.staticMethod = function () {/* code here */};