2016-08-31 11 views
1

Как нет нет частной поддержки методы еще в Javascript, я обычно просто объявить нормальную функцию вне тела класса и обеспечиваю this в качестве аргумента:super.method контекста обработки в ES6

class Foo { 
    constructor() { 
     _doPrivateStuff(this); 
    } 
} 

function _doPrivateStuff(that) { 
    that.bar() // private stuff 
} 

export default Foo; 

Но как я могу Асесс super.method таким образом?

function _doPrivateStuff(that) { 
    super.method(); // error, 'super' outside of function or class 
} 

Кроме того, есть хорошая причина, почему я не должен использовать «частные» функции, как это?

Btw, я попробовал только это на Бабеля, и используя _doPrivateStuff.bind(this)() вместо использования that не работает либо

+0

Почему бы не сделать это в конструкторе? Do 'super.method' в конструкторе – Li357

+0

для моего варианта использования это будет слишком много обхода, у меня на самом деле есть функция более высокого порядка, которая создает некоторые функции, поэтому я могу использовать их как методы (полагаясь на super.method), I удалось найти хакерское обходное решение с использованием функций стрелок в конструкторе для определения методов оттуда и использования супер внутри, но это далеко не изящно и даже из любопытства, я хотел бы знать, можно ли обрабатывать контекст «супер» – Faccion

ответ

3

super работает только внутри самого, потому что для super работать, класс должен знать Foo класса, поэтому он может сделать (упрощенное) Object.getPrototypeOf(Foo).method.call(this) для вызова родительского класса method. Когда у вас только есть отдельная функция, класс не может знать, как позвонить super.

Чтобы сделать то, что вы хотите, вы должны были бы сделать

class Foo { 
    constructor() { 
     _doPrivateStuff(this,() => super.bar()); 
    } 
} 

function _doPrivateStuff(that, superBar) { 
    superBar(); 
} 

Чтобы расширить на том, что с контрпример, что, если ваш был дополнительный слой классов:

class Base { 
    method(){ console.log('base'); } 
} 
class Mid extends Base { 
    method(){ console.log('mid'); } 

    run(){ doPrivateThing(this); } 
} 

class Child extends Mid {} 

new Child(); 

function doPrivateThing(that){ 
    // super.method(); 
} 

Если ваш например, работала, вы передали doPrivateThing экземпляр Child, он не знает, что он был вызван изнутри Mid, должен ли он регистрировать mid или base? Недостаточно информации.

+0

Я, по сути, делаю то же обходное решение, но это далеко не удобно для моего варианта использования. – Faccion

+0

коррекция: я делал подобное обходное решение, используя функции стрелок, но на самом деле это другое, я попробую его – Faccion

+0

функция стрелки как аргумент для меня работала, спасибо! Тем не менее, мне интересно. Если по какой-то причине это плохая практика, и если я должен избегать действий, требующих такого решения – Faccion