是否可以将已经初始化的对象文字作为已定义类的实例?

时间:2019-07-03 05:08:24

标签: javascript node.js object ecmascript-6

我想知道是否可以将已经初始化的对象文字转换为已经定义的类的实例。

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 个答案:

答案 0 :(得分:1)

已经有一种方法-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();

答案 1 :(得分:1)

“初始化的对象文字”只是一个对象,其创建方式通常不超出其创建之时。好像由Object.createnew Object()创建的对象(如文字)通常称为“普通对象”。

ECMAScript没有类,它具有原型继承和类语法来实例化从特定构造函数的原型继承的对象。

因此,如果您希望普通对象从特定对象的原型继承方法而不使用构造函数来创建该对象,则可以使用Object.setPrototypeOf将所需的构造函数的原型分配给普通对象的[[Prototype]]

但是,最好构造一个所需的“类”的新实例,并使用 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);

答案 2 :(得分:0)

是您想要的吗? obj使用new关键字声明...

obj = Object.assign(obj, { foo: function (){ console.log("foo foo!"); } } );

答案 3 :(得分:-1)

经过测试,它将完成工作,诀窍是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