Можно ли сделать уже инициализированный литерал объекта экземпляром определенного класса? - PullRequest
1 голос
/ 03 июля 2019

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

class ParentClass {
   bye () { console.log("Bye!"); }
}

class ChildClass extends ParentClass { 
   hello () { console.log("Hello!"); }
}

let obj = { foo: function (){ console.log("foo foo!"); } }

// [JS code that i wish i knew] //

obj.hello() // "Hello!" 
obj.bye() // "Bye!"
obj.foo() // "foo foo!"

console.log(obj instanceof ChildClass) // true

Ответы [ 4 ]

1 голос
/ 03 июля 2019

«Инициализированный литерал объекта» - это просто объект, способ его создания, как правило, не важен после момента его создания. Объекты, созданные как будто с помощью Object.create или new Object() (например, литералы), обычно называют "простыми объектами".

ECMAScript не имеет классов, он имеет наследование прототипа и синтаксис класса для создания экземпляров объектов, которые наследуются от прототипа конкретного конструктора.

Таким образом, если вы хотите, чтобы простой объект наследовал методы от прототипа конкретного объекта без использования конструктора для создания объекта, вы можете назначить прототип необходимого конструктора для простого объекта [[Prototype]], используя Object. setPrototypeOf .

Однако вам может быть лучше создать новый экземпляр «класса», который вы хотите, и скопировать в него свойства простого объекта, используя Object.assign , что-то вроде:

class Person {
  constructor (name, age) {
    this.name = name;
    this.age = age;
  }
}

let obj = {
  name: 'fred',
  age: '37'
};

let person = Object.assign(new Person(), obj);

console.log(person.name);
1 голос
/ 03 июля 2019

Для этого уже есть метод - setPrototypeOf:

class ParentClass {
  bye() {
    console.log("Bye!");
  }
}

class ChildClass extends ParentClass {
  hello() {
    console.log("Hello!");
  }
}

let obj = {
  foo() {
    console.log("foo foo!");
  }
};

Object.setPrototypeOf(obj, ChildClass.prototype);

obj.hello();
obj.bye();
obj.foo();
0 голосов
/ 03 июля 2019

Протестировано, будет работать, трюк Object.assign:

class ParentClass {
   bye () { console.log("Bye!"); }
}

class ChildClass extends ParentClass { 
   hello () { console.log("Hello!"); }
}

let obj = { foo: function (){ console.log("foo foo!"); } }

// [JS code that i wish i knew] // here is how it works
obj = Object.assign(new ChildClass(), obj)

obj.hello() // "Hello!" 
obj.bye() // "Bye!"
obj.foo() // "foo foo!"

console.log(obj instanceof ChildClass) // true
0 голосов
/ 03 июля 2019

Это то, что вы хотите? Объект объявляется с ключевым словом new ...

obj = Object.assign(obj, { foo: function (){ console.log("foo foo!"); } } );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...