Как сделать так, чтобы конструктор имел доступные члены, когда он вызывается как объект - PullRequest
0 голосов
/ 05 ноября 2018

Я могу сделать это в JavaScript:

var output = String(result);

И я могу сделать это с тем же объектом, на который есть ссылка, используя String:

var character = String.fromCharCode(10);

String может использоваться как функция для создания объекта. и члены могут быть вызваны для него без использования его в качестве конструктора. Как сделать объект пригодным для использования обоими этими способами? Как это называется?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Просто

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

MyClass.staticMethod = function () {/* code here */};
0 голосов
/ 05 ноября 2018

Вы говорите о методах класса.

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....
}

Но это много странных вещей, просто чтобы избежать определения метода класса после конструктора, и он по-прежнему не решает первую проблему.

0 голосов
/ 05 ноября 2018

Вы можете создать класс со статическими методами:

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

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

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

Foo.fromThing () является аналогом String.fromCharCode ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...