例如,我已经在代码中的某处有这个对象,它是一个通用对象:
var person1={lastName:"Freeman",firstName:"Gordon"};
我有一个Person对象的构造函数:
function Person(){
this.getFullName=function(){
return this.lastName + ' ' + this.firstName;
}
}
是否有一个简单的语法允许我们将person1转换为Person类型的对象?
答案 0 :(得分:38)
@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];
}
答案 1 :(得分:7)
否。
但是,如果您希望将person1
对象视为Person
,则可以使用{Person
上的person1
原型调用方法{1}}:
call
虽然这显然不适用于在Person构造函数内创建的特权方法 - 就像您的Person.prototype.getFullNamePublic = function(){
return this.lastName + ' ' + this.firstName;
}
Person.prototype.getFullNamePublic.call(person1);
方法一样。
答案 2 :(得分:3)
这不完全是一个答案,而是分享我的发现,并希望得到一些批评/反对它,特别是我不知道它有多高效。
我最近需要为我的项目执行此操作。我使用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]));
}
答案 3 :(得分:1)
这里借用了其他一些答案,但我认为这可能有助于某人。如果在自定义对象上定义以下函数,则可以使用工厂函数将通用对象传递给它,它将为您返回该类的实例。
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);
答案 4 :(得分:1)
这只是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",
...
答案 5 :(得分:0)
这对我有用。对于简单的对象来说很简单。
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具有另一个构造函数,称为“类”,该构造函数与与 Person 具有相同“格式”的通用对象一起使用。 我希望这也会对某人有所帮助。
答案 6 :(得分:0)
如果你愿意,这里有一个方法。 1st 用你所有想要的属性制作一个对象。 然后使用您的自定义值调用此对象。 这是 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));