У меня есть два класса (скажем, class1 и class2), и я хотел бы сделать class2 частью class1 и создать его экземпляр.
То, чем я хотел бы управлять, это: Я просто добавляю полный пример
const class1 = new Class1();
const class2 = new class1.Class2();
Любые идеи?
Редактировать:
@spender дал решение
class Class2{
foo: number = 0
constructor(foo: number) {
this.foo = foo;
}
bar(){
return this.foo;
}
};
class Class1 {
static c2: any;
get Class2() {
return Class1.c2;
}
}
Class1.c2 = Class2;
var c1 = new Class1();
var c2 = new c1.Class2(42);
console.info(c2.bar())
По сути, сделать конструктор класса 2 функцией класса 1.
Я должен признаться вам, что ваши ожидания на самом деле не очень ясны. Я имею в виду, почему вам нужен конструктор, который использует this
или self
в другой области видимости для создания экземпляра другого класса. Но я точно близорук.
Я обновил свой ответ, охватывающий сценарий, в котором вы переопределяете конструктор данного класса, используя функцию из другого класса.
Если вы просите иметь объект в результате объединения двух объектов, это может быть решением:
const class1 = new Class1();
const class2 = new Class2();
let fusion= {
...class1 ,
...class2
};
Так, например:
let a = {name : 'John'};
let b = {surname : 'Doe'};
let fusion = {...a,...b}; //will be {name: 'John', surname: 'Doe'}
В этом решении используется оператор распространения:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
Если вы имели в виду что-то другое, поправьте меня.
Но, с другой стороны, если вы действительно хотите создать экземпляр Class2 с помощью конструктора, принадлежащего Class1, вы можете сделать что-то очень и очень подозрительное, например:
Class2.constructor = Class1.constructor;
let obj = new Class2();
Но вы назначаете новый конструктор Class2, используя функцию, принадлежащую Class1, и результат будет очень грязным, если вы заранее не знаете, что делаете. Но это именно то, что вы просили.
Я хотел бы отметить тот факт, что таким образом Class1 и Class2 не должны знать друг друга заранее, и зависимость от каждого из них создается в вызывающем домене.
У вас не может быть такой инициализации, но вы можете иметь аналогичный способ через вызов функции
class Class2 {
test() {
console.info('testing class 2')
}
}
class Class1 {
newClass2() {
return new Class2();
}
test() {
console.info('testing class 1')
}
}
const class1 = new Class1();
class1.test() //testing class 1
const class2 = class1.newClass2(); //new class 2
class2.test() //testing class 2
Да. Вы можете, например, сделать это так, используя выражение класса и добытчик, которые в данном случае извлекают статическое свойство Class1
class Class1 {
get Class2() {
return Class1.c2.bind(null, 42);
}
}
Class1.c2 = class {
constructor(foo) {
console.info(`inner class constructed with ${foo}`);
}
};
var c1 = new Class1();
var c2 = new c1.Class2();
Спасибо, работает как шарм! Последний вопрос. Знаете ли вы способ скрыть параметр конструктора (42) извне классов, передать его из класса 1 и продолжать использовать ключевое слово new для создания экземпляра класса 2? var c2 = new c1.Class2() // but give 42 inside Class1
?
вы просите создать объект, имеющий свойства как сумму двух разных классов?