Aligatro
@Aligatro
Turn food and coffee into software...

Как задать имя объекта, возвращаемого методом класса в es6?

Я понимаю, что это наркомания, но мне дико интересно.

Как сделать так что-бы метод "createSomeObj" возвращал именованный объект, либо с именем класса откуда он был вызван, либо с ново присвоенным.

class myClass {
		constructor() {
			this.createSomeObj = this.createSomeObj.bind(this);
		}
		
		createSomeObj() {
			var newObj = {1:1, 2:2};
			return newObj
		}
	}
	
	var instance = new myClass();
	console.log(instance.createSomeObj()) // should be 'myClass' {1:1, 2:2}


Спасибо.
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Вариант 1: Создаваемым объектам можно переопределять свойство __proto__, а взять его можно из экземпляра класса:
class myClass {    
  createSomeObj() {
    const newObj = { 1: 1, 2: 2 };

    newObj.__proto__ = this.__proto__;

    return newObj;
  }
}
  
const instance = new myClass();
const instanceOfInstance = instance.createSomeObj();

console.log(instanceOfInstance.createSomeObj()); // myClass {1: 1, 2: 2}

Демо.
Объекту будут доступны методы класса и он будет проходить проверку instanceof.

Вариант 2: Вы так же можете переопределять лишь конструктор:
class myClass {    
  createSomeObj() {
    const newObj = { 1: 1, 2: 2 };

    newObj.__proto__.constructor = myClass;

    return newObj;
  }
}
  
const instance = new myClass();

console.log(instance.createSomeObj()); // myClass {1: 1, 2: 2}

Демо.
В этом случае объекту не будут доступны методы класса и он не будет проходить проверку instanceof.

Вариант 3: Статический метод и прямое создание экземпляра.
class myClass {
  constructor(props) {
    Object.keys(props).forEach(key => this[key] = props[key]);
  }
  
  static createSomeObj() {   
    return new myClass({ 1: 1, 2: 2 });
  }
}
  
console.log(myClass.createSomeObj()); // myClass {1: 1, 2: 2}

Демо.
Прямое создание экземпляра класса, без необходимости в экземпляре для его создания.

Думаю, вам больше подойдут третий или первый варианты.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы