'use strict';

class Test {
    lorem () {

    }

    static ipsum () {

    }
}

console.log(Test.lorem); // undefined
console.log(Test.ipsum); [Function]

Есть ли способ получить доступ к Test.lorem? Я пробовал Test.prototype.lorem и Test.lorem, но оба возвращают неопределенный.

Конструктор функции, которую я хочу протестировать, выполняет некоторые функции, подобные конструктору, поэтому в модульном тесте я просто хочу вместо этого запустить функцию непосредственно из класса.

Любые идеи?

-1
lededje 17 Дек 2015 в 02:44

4 ответа

Лучший ответ

Метод доступен в prototype.

Test.prototype.lorem

Однако помните, что непосредственный вызов этого метода означает, что this не будет ссылаться на экземпляр объекта.

Test.lorem не определен, потому что это не статический метод. Нестатические методы добавляются в объект prototype.

Доказательство скомпилировано из Babel 6 с предустановкой ES2015.

'use strict';

var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Test = (function () {
    function Test() {
        _classCallCheck(this, Test);
    }

    _createClass(Test, [{
        key: 'lorem',
        value: function lorem() {}
    }], [{
        key: 'ipsum',
        value: function ipsum() {}
    }]);

    return Test;
})();

console.log(Test.prototype.lorem);
2
Alexander O'Mara 17 Дек 2015 в 10:32

Не уверен, почему я получил -1, но ж / д

Методы класса не перечисляются в ES2015

Вы не можете получить прямой доступ к членам класса, которые не являются статичными.

https://phabricator.babeljs.io/T959

-2
lededje 17 Дек 2015 в 10:14

Вам нужен экземпляр для Test.

class Test {
      lorem () {
        console.log('test');
      }

      static ipsum () {

      }
  }

  var test = new Test();
  test.lorem();

Или ты можешь сделать

Test.prototype.lorem();
-1
mariocatch 16 Дек 2015 в 23:49

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

Это очень фундаментальная концепция в большинстве (если не во всех) объектно-ориентированных языках.

Если вы хотите получить только ссылку на функцию, использование прототипа класса работает.

Кроме того, вы на самом деле можете выполнять метод без экземпляра, так как JavaScript допускает такую гибкость, но, тем не менее, вам следует избегать такой практики.

0
Amit 16 Дек 2015 в 23:58