Могу ли я создать метод класса, который будет использоваться каждым свойством созданного объекта? - PullRequest
1 голос
/ 30 марта 2020

Могу ли я создать метод, используемый каждым свойством объекта?

class myClass {
    constructor() {
        this.a = 1;
        this.b = 2;
        this.c = 3;
    }
    raise(x) {
        this += x;              //I know this doesn't work. I want the raise function to use 
                                //the value of its caller and increase it by x
    };
}

Чего я хочу добиться, так это возможности вызывать метод повышения любого свойства объекта через

obj1 = new myClass();

obj1.a.raise(1);            //a = 2
obj1.b.raise(3);            //b = 5
obj1.c.raise(100);          //c = 103

Итак, я хочу использовать этот синтаксис: object.property.method ()

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

Ответы [ 3 ]

0 голосов
/ 30 марта 2020

Используя ES6, вы можете сделать это легко. Вам может не понадобиться сложное решение! Пример приведен ниже.

2-й раствор для использования композиции.

class PriceList {
  constructor(price, amount) {
    this._price = price;
    this._amount = amount;
  }

  get price() {
    return this._price;
  }

  set price(p) {
    this._price += p; // validation could be checked here such as only allowing non numerical values
  }
  get amount() {
    return this._amount;
  }

  set amount(p) {
    this._amount += p; // validation could be checked here such as only allowing non numerical values
  }
}
const priceList = new PriceList(1, 10);
console.log(priceList); // PriceList { _price: 1, _amount: 10 }
priceList.amount = 10;
priceList.price = 100;

console.log(priceList); // PriceList { _price: 101, _amount: 20 }
class Value {
  constructor(v) {
    this._val = v;
  }
  get val() {
    return this._val;
  }
  set(v) {
    this._val = v;
  }
  raise(m) {
    this._val += m;
  }
}
class PriceList2 {
  constructor(price, amount) {
    this.amount = new Value(amount);
    this.price = new Value(price);
  }
}
const priceList2 = new PriceList2(1, 10);
console.log(priceList2);
priceList2.amount.raise(10);
priceList2.price.raise(100);

console.log(priceList2.amount.val); // 20
console.log(priceList2.price.val); // 101

priceList2.amount.val = 1
priceList2.amount.raise(10);

console.log(priceList2.amount.val); //30
.as-console-row {color: blue!important}
0 голосов
/ 30 марта 2020

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

class myClass {
    constructor() {
        this.a = new Number(1);
        this.b = new Number(2);
        this.c = new Number(3);
        
        for (let p in this) {
          this[p].raise = x => {
            let fn = this[p].raise;
            this[p] = new Number(x + this[p]);
            this[p].raise = fn;
          }
        }
    }
}
let m = new myClass();
m.a.raise(15);
m.a.raise(15);
// A = 1 + 15 + 15 = 31
m.b.raise(10);
m.b.raise(20);
// B = 2 + 10 + 20 = 32
m.c.raise(17);
m.c.raise(13);
// C = 3 + 17 + 13 = 33
console.log(m.a + 1, m.b + 1, m.c + 1) // 32  33  34
// logging just m.a, m.b, m.c will get you an object with a raise function
// only in stack overflow (or maybe other fake consoles), but the browser
// console will definitely work and give you a Number object
0 голосов
/ 30 марта 2020

Невозможно, чтобы obj.a вернул число, а также смог вызвать obj.a.raise, чтобы изменить его.

Если вы открыты для небольшой настройки, вы можете получить значение через метод, называемый чем-то вроде .get, тогда как базовое значение сохраняется и переназначается в свойстве _a:

class myClass {
  constructor() {
    this._a = 1;
    this.a = { raise: num => this._a += num, get: () => this._a };
  }
}
const obj = new myClass();

obj.a.raise(1);            //a = 2
console.log(obj.a.get());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...