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

例如,我在代码中已经有了这个对象,它是一个泛型对象:

var person1={lastName:"Freeman",firstName:"Gordon"};

我有 Person 对象的构造函数:

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

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

144077 次浏览

但是如果你想把 person1对象当作 Person对待,你可以用 callperson1上调用 Person原型上的方法:

Person.prototype.getFullNamePublic = function(){
return this.lastName + ' ' + this.firstName;
}
Person.prototype.getFullNamePublic.call(person1);

尽管对于 Person 构造函数内部创建的特权方法(比如 getFullName方法) ,这显然无法工作。

@ PeterOlson 的答案可能在过去是可行的,但看起来 Object.create已经改变了。 我会像@user166390在评论中说的那样使用复制构造函数。
我对这篇文章进行死灵化的原因是因为我需要这样的实施。

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

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


getFullName() {
return `${this.lastName} ${this.firstName}`;
}
}

用法:

const newPerson = new Person(person1)
newPerson.getFullName() // -> Freeman Gordon

ES5答案在下面

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

用法:

var newPerson = new Person(person1);
console.log(newPerson.getFullName()); // -> Freeman Gordon

使用较短的版本,1.5行:

function Person(){
if(arguments[0]) for(var prop in arguments[0]) this[prop] = arguments[0][prop];
}

Jsfiddle

这不是一个确切的答案,而是分享我的发现,并希望得到一些批判性的论据支持/反对它,特别是我不知道它是如何有效。

最近我的项目需要这样做。我使用 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]));
}

这里借用了一些其他的答案,但我认为它可能会有所帮助。如果您在自定义对象上定义了以下函数,那么您就有了一个可以传递泛型对象的工厂函数,它将为您返回类的一个实例。

CustomObject.create = function (obj) {
var field = new CustomObject();
for (var prop in obj) {
if (field.hasOwnProperty(prop)) {
field[prop] = obj[prop];
}
}


return field;
}

像这样使用

var typedObj = CustomObject.create(genericObj);

以下是 Sayan Pal 的简短回答,ES5风格:

var Foo = function(){
this.bar = undefined;
this.buzz = undefined;
}


var foo = Object.assign(new Foo(),{
bar: "whatever",
buzz: "something else"
});

我喜欢它,因为它最接近.Net 中非常整洁的对象初始化:

var foo = new Foo()
{
bar: "whatever",
...

这对我很有用,对简单的物体很简单。

class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
getFullName() {
return this.lastName + " " + this.firstName;
}


static class(obj) {
return new Person(obj.firstName, obj.lastName);
}
}


var person1 = {
lastName: "Freeman",
firstName: "Gordon"
};


var gordon = Person.class(person1);
console.log(gordon.getFullName());

我也在寻找一个简单的解决方案,这就是我想出来的,基于所有其他的答案和我的研究。基本上,类 Person 有另一个构造函数,称为“ class”,它使用与 “格式”相同的泛型对象。 我希望这也能帮到别人。

如果你喜欢,这里有一个方法。 首先,用你所有的欲望属性创造一个物体。 然后使用自定义值调用此对象。 这里是到 JSFiddle的链接,也是

 function Message(obj) {
this.key = Date.now();
this.text = "";
this.type = "client";
this.status = 0;
this.senderID = "";
this.name = "";
this.photoURL = "";
this.metaData = [];
this.time = new Date().toISOString();
  

for (var prop in obj) {
if (this.hasOwnProperty(prop)) {
this[prop] = obj[prop];
}else{
this.metaData = [ ...this.metaData, {[prop]: obj[prop]} ];
}
}
}


const getAllMessages = function (messages=[]) {
var newMessages = [];
for (var i = 0; i < messages.length; i++) {
newMessages.push(new Message(messages[i]));
}
return newMessages;
};


var messages = [{
name: "Jhon",
text: "Hello 1"
}, {
name: "Smith",
text: "Hello 2",
meta1: "meta data 1"
}];


console.log("single Instances", new Message(messages[0]));


console.log("Multiple Instances",getAllMessages(messages));