我们可以在javascript中将通用对象转换为自定义对象类型吗?

bob*_*obo 54 javascript oop object

例如,我已经在代码中的某处有这个对象,它是一个通用对象:

var person1={lastName:"Freeman",firstName:"Gordon"};
Run Code Online (Sandbox Code Playgroud)

我有一个Person对象的构造函数:

function Person(){
 this.getFullName=function(){
  return this.lastName + ' ' + this.firstName;
 }
}
Run Code Online (Sandbox Code Playgroud)

是否有一个简单的语法允许我们将person1转换为Person类型的对象?

A1r*_*Pun 42

@PeterOlson的答案可能会在当天恢复,但看起来好像Object.create已经改变了.我会像@ user166390在评论中所说的那样去复制构造函数.
我对这篇文章进行了暗示是因为我需要这样的实现.

现在我们可以使用Object.assign(@SayanPal解决方案)和ES6语法:

class Person {
  constructor(obj) {
    obj && Object.assign(this, obj);
  }

  getFullName() {
    return `${this.lastName} ${this.firstName}`;
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

const newPerson = new Person(person1)
newPerson.getFullName() // -> Freeman Gordon
Run Code Online (Sandbox Code Playgroud)

ES5回答如下

function Person(obj) {
    for(var prop in obj){
        // for safety you can use the hasOwnProperty function
        this[prop] = obj[prop];
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var newPerson = new Person(person1);
console.log(newPerson.getFullName()); // -> Freeman Gordon
Run Code Online (Sandbox Code Playgroud)

使用较短的版本,1.5衬垫:

function Person(){
    if(arguments[0]) for(var prop in arguments[0]) this[prop] = arguments[0][prop];
}
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

  • "1.5班轮"版本的道具,喜欢它. (2认同)

Ada*_*kis 7

没有.

但是,如果你正在寻找把你的person1对象,就好像它是一个Person,你可以调用方法Person上的原型person1call:

Person.prototype.getFullNamePublic = function(){
    return this.lastName + ' ' + this.firstName;
}
Person.prototype.getFullNamePublic.call(person1);
Run Code Online (Sandbox Code Playgroud)

虽然这显然不适用于Person构造函数内部创建的特权方法 - 就像您的getFullName方法一样.


Say*_*Pal 7

这不完全是一个答案,而是分享我的发现,并希望得到一些支持/反对它的批判性论据,因为具体来说我不知道​​它的效率如何。

我最近需要为我的项目执行此操作。我这样做是使用Object.assign,更确切地说是做这样的事情:Object.assign(new Person(...), anObjectLikePerson)

这是我的JSFiddle 的链接,也是代码的主要部分:

function Person(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;

  this.getFullName = function() {
    return this.lastName + ' ' + this.firstName;
  }
}

var persons = [{
  lastName: "Freeman",
  firstName: "Gordon"
}, {
  lastName: "Smith",
  firstName: "John"
}];

var stronglyTypedPersons = [];
for (var i = 0; i < persons.length; i++) {
  stronglyTypedPersons.push(Object.assign(new Person("", ""), persons[i]));
}
Run Code Online (Sandbox Code Playgroud)