2016-07-31 3 views
0

React-ecma6 dosent, похоже, позволяет определять геттеры без сеттеров Есть ли способ определить метод только для геттера и изменить значение с помощью любого другого метода?определить геттер без сеттера ecma6 - отреагировать

import React from 'react'; 
export default class GetterOnly extends React.Component { 
    constructor(props) { 
     super(props); 
     this._is_on = false; 
    } 

    on() { 
     this._is_on = true; 
    } 

    get is_on() { 
     return this._is_on; 
    } 

    render() { 

    } 
} 
var _getter = new GetterOnly() 
_getter.on(); 

Uncaught TypeError: Cannot set property is_on of #GetterOnly which has only a getter

patchProperty @ makeAssimilatePrototype.js:21 (anonymous function) @ makeAssimilatePrototype.js:52 (anonymous function) @ makeAssimilatePrototype.js:51 reconcileWithStoredPrototypes @ makeAssimilatePrototype.js:50 assimilatePrototype @ makeAssimilatePrototype.js:63 patchReactClass @ makePatchReactClass.js:40 makeHot @ makeMakeHot.js:33 makeExportsHot @ makeExportsHot.js:44 (anonymous function) @ GetterOnly.js:139 (anonymous function) @ GetterOnly.js:139 (anonymous function) @ GetterOnly.js:140 (anonymous function) @ app.js:5062 webpack_require @ app.js:556 fn @ app.js:87 (anonymous function) @ page.js:35 (anonymous function) @ page.js:81 (anonymous function) @ page.js:82 (anonymous function) @ app.js:5056 webpack_require @ app.js:556 fn @ app.js:87 (anonymous function) @ Routes.js:19 (anonymous function) @ Routes.js:52 (anonymous function) @ Routes.js:53 (anonymous function) @ app.js:4438 webpack_require @ app.js:556 fn @ app.js:87 (anonymous function) @ makoVOD.js:19 (anonymous function) @ makoVOD.js:62 (anonymous function) @ makoVOD.js:63 (anonymous function) @ app.js:1042 webpack_require @ app.js:556 fn @ app.js:87 (anonymous function) @ multi_main:3 (anonymous function) @ app.js:586 webpack_require @ app.js:556 (anonymous function) @ app.js:579 (anonymous function) @ app.js:582

+2

Нет, это разрешено - это не синтаксическая ошибка. Сообщение об ошибке, которое вы получили, предполагает, что что-то пыталось присвоить '.is_on', который генерирует исключение без сеттера. Проверьте трассировку стека ошибки, чтобы узнать, откуда она. – Bergi

+0

это упрощенная версия кода, и она все еще показывает ошибку: 'import React from 'react'; класс GetterOnly распространяется на React.Component { \t конструктор (реквизит) { \t \t супер (реквизит); \t \t}; \t \t get is_on() { \t \t return this._is_on; \t}; \t render() { \t}; } export default GetterOnly ' –

+0

Это похоже на проблему с модулями импорта/экспорта –

ответ

-4

Проблема заключается в том, что вы вызываете on как функцию. Геттерный делает функцию выглядеть свойство:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get

Так что последняя строка должна быть _getter.on вместо _getter.on().

Кроме того, чтобы сделать что _is_on переменная частные, вы можете определить его вне класса, например, так:

import React from 'react'; 

let _is_on = false; 

export default class GetterOnly extends React.Component { 
    constructor(props) { 
     super(props); 
    } 

    on() { 
     _is_on = true; 
    } 

    get is_on() { 
     return _is_on; 
    } 

    render() { 

    } 
} 
var _getter = new GetterOnly() 
_getter.on; 

Теперь никто, но класс может изменить переменную.

+1

'on' метод действительно и должен быть вызван. 'let_is_on = false;' разделит этот флаг между всеми экземплярами. –

0

Задача wasent React/Es6 reponsibility. Он появился из модуля nodejs - webpack.hot ..., который я использовал для автоматического перевода кода. Я обновился до версии 2.0.0-alpha, и ошибка исчезла. его известная проблема в - https://github.com/gaearon/react-hot-loader/issues/131

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