Есть ли способ создать метод в классе javascript просто для создания переменных? - PullRequest
0 голосов
/ 12 января 2019

Как можно избежать одной и той же строки кода const myObject = this._getMyObject(); из нескольких методов?

У меня есть метод _getMyObject() в классе, который возвращает Object[]. Я использую его в различных других методах const myObject = this._getMyObject();
Есть ли способ создать метод или что-то, что возвращает мою переменную const myObject = this._getMyObject();, которую я могу вызвать в других методах?

export default class MyClass {
    _getMyObject() {
        //   some code
    }
    _getMySecondObject() {
        //   some code
    }

    _methodOne() {
        const myObject = this._getMyObject();
        const mySecondObject = this._getMySecondObject();
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
    _methodTwo() {
        const myObject = this._getMyObject();
        const mySecondObject = this._getMySecondObject();
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
    _methodThird() {
        const myObject = this._getMyObject();
        const mySecondObject = this._getMySecondObject();
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
}

Спасибо, Ритаж, за решение моей проблемы:

    _getLengthOfBoth() {
        const myObject = this._getMyObject();
        const mySecondObject = this._getMySecondObject();
        const lengthOfBoth = myObject.length + mySecondObject.length;
        return lengthOfBoth;
    }

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Я не уверен, что это даже связано с вашим вопросом, но вы можете попробовать это:

const obj1 = (src) => src._getMyObject();
const obj2 = (src) => src._getMySecondObject();


export default class MyClass {
    _getMyObject() {
        //   some code
    }
    _getMySecondObject() {
        //   some code
    }

    _methodOne() {
        const myObject = obj1(this);
        const mySecondObject = obj2(this);
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
    _methodTwo() {
        const myObject = obj1(this);
        const mySecondObject = obj2(this);
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
    _methodThird() {
        const myObject = obj1(this);
        const mySecondObject = obj2(this);
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
}

Это меньше символов для ввода и obj1 и obj2 могут минимизировать, если это важно для вас.

Вы могли бы даже пойти дальше и создать псевдо-приватные функции для своего класса вместо использования подчеркивания.

const getMyObject = (src) => {
  // The code that used to be in MyClass._getMyObject()
};
const getMySecondObject = (src) => {
  // The code that used to be in MyClass._getMySecondObject()
};


export default class MyClass {
    _methodOne() {
        const myObject = getMyObject(this);
        const mySecondObject = getMySecondObject(this);
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
    _methodTwo() {
        const myObject = getMyObject(this);
        const mySecondObject = getMySecondObject(this);
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
    _methodThird() {
        const myObject = getMyObject(this);
        const mySecondObject = getMySecondObject(this);
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
}

Или даже так:

const getMyObject = () => {
  // `this` === the object just like when it was a function of the object
  // The code that used to be in MyClass._getMyObject()
};
const getMySecondObject = () => {
  // `this` === the object just like when it was a function of the object
  // The code that used to be in MyClass._getMySecondObject()
};


export default class MyClass {
    _methodOne() {
        const myObject = getMyObject.bind(this)();
        const mySecondObject = getMySecondObject.bind(this)();
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
    _methodTwo() {
        const myObject = getMyObject.bind(this)();
        const mySecondObject = getMySecondObject.bind(this)();
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
    _methodThird() {
        const myObject = getMyObject.bind(this)();
        const mySecondObject = getMySecondObject.bind(this)();
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
}

В этом примере благодаря bind(this) вы создаете истинную приватную функцию для экземпляра класса, и каждый вызов getMyObject и getMySecondObject будет иметь соответствующее значение this.

Еще один вариант - использовать деструктуризацию:

const getMyObjects = () => {
  // `this` === the object just like when it was a function of the object
  // The code that used to be in
  // MyClass._getMyObject() and  MyClass._getMySecondObject()
  
  return {myObject, mySecondObject};
};


export default class MyClass {
    _methodOne() {
        const {myObject, mySecondObject} = getMyObjects.bind(this)();
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
    _methodTwo() {
        const {myObject, mySecondObject} = getMyObjects.bind(this)();
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
    _methodThird() {
        const {myObject, mySecondObject} = getMyObjects.bind(this)();
        const lengthOfBoth = myObject.length + mySecondObject.length;
        //some code
    }
}

Это позволяет одной функции выполнять работу, которая была в _getMyObject и _getMySecondObject, и возвращать два ответа в одном объекте. Результаты объекта деструктурируются и помещаются в две переменные myObject и mySecondObject.

UPDATE

Извините. Я написал:

const myObject = getMyObject.bind(this); когда я должен был написать const myObject = getMyObject.bind(this)();

Это было исправлено.

0 голосов
/ 14 января 2019

используйте конструктор

export default class MyClass {
constructor(){
  this.myObject = this._getMyObject();
  this.mySecondObject = this._getMySecondObject();
}

_getMyObject() {
    //   some code
}
_getMySecondObject() {
    //   some code
}

_methodOne() {
    const lengthOfBoth = this.myObject.length + this.mySecondObject.length;
    //some code
}
_methodTwo() {
    const lengthOfBoth = this.myObject.length + this.mySecondObject.length;
    //some code
}
_methodThird() {
    const lengthOfBoth = this.myObject.length + this.mySecondObject.length;
    //some code
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...