2015-12-16 2 views
-1

Access функция член

'use strict'; 
 

 
class Test { 
 
    lorem() { 
 

 
    } 
 

 
    static ipsum() { 
 

 
    } 
 
} 
 

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

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

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

Любые идеи?

+2

'Test.prototype.lorem' не должен возвращать неопределенными: https://babeljs.io/repl/#?experimental=false&evaluate=true&loose=false&spec=false&code=class%20Test%20%7B% 0D% 0A% 20% 20% 20% 20lorem% 20()% 20% 7B% 0D% 0A% 0D% 0A% 20% 20% 20% 20% 7D% 0D% 0A% 0D% 0A% 20% 20% 20% 20static% 20ipsum% 20()% 20% 7B% 0D% 0A% 0D% 0A% 20% 20% 20% 20% 7D% 0D% 0A% 7D% 0D% 0A% 0D% 0Aalert (Test.prototype. lorem)% 3B% 20% 2F% 2F% 20undefined% 0D% 0Aalert (Test.ipsum)% 3B% 20% 2F% 2F% 20% 5BFunction% 5D% 20 – TbWill4321

+0

ПРИМЕЧАНИЕ: Этот REPL по-прежнему использует Babel 5.x, но скоро будут обновлены до Babel 6! Это не поведение спецификации. См. Мой ответ ниже. – lededje

ответ

2

Метод доступен в 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);

+0

Половина правильных ... Они добавлены к прототипу, но там их нет; см. мой ответ. – lededje

+0

@lededje См. Фрагмент кода, который я добавил, и проверьте консоль разработчика. Используя Babel 6 с предустановкой ES2015, у меня нет никаких проблем с доступом к методу из прототипа. –

0

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

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

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

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

+0

Действительно? Я думал, что синтаксис «class» был просто сдерживающим сахаром над существующей прототипной системой, которая позволила это сделать. Интересно ... –

+1

@JeremyBanks верен, вы можете получить доступ к функции через прототип. – TbWill4321

+0

Да, этот ответ неправильный. Возможно, ОП ошибается в своём собственном коде, или Бабель производит нестандартное поведение. Я просто выполнил этот нестатический метод через свой прототип, используя встроенную реализацию Chrome как «Test.prototype.lorem()», и он работал так, как я ожидал. –

-1

Вам понадобится экземпляр для Test.

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

     static ipsum() { 

     } 
    } 

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

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

Test.prototype.lorem(); 
+0

Не тот случай; См. Мой ответ. – lededje

-2

Не знаю, почему я получил -1, но ж/д

Методы класса несчетных в ES2015

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

https://phabricator.babeljs.io/T959

+1

Даже если он не перечислим, он все равно должен быть доступен. –

+0

Видимо, нет, пытаясь найти это в официальной спецификации. – lededje

+1

Как я вижу, ссылка рассказывает о том, как 'console.log (Foo.prototype);' создавал '{bar: [Function: bar]}', а не '{}', который является полностью отдельным вопрос. Посмотрите фрагмент в моем ответе. –

Смежные вопросы