Можем ли мы наложить общий объект на пользовательский тип объекта в javascript?
Например, у меня уже есть этот объект где-то в коде, это общий объект:
var person1={lastName:"Freeman",firstName:"Gordon"};
У меня есть конструктор для объекта Person:
function Person(){
this.getFullName=function(){
return this.lastName + ' ' + this.firstName;
}
}
Есть ли простой синтаксис, который позволяет нам преобразовать person1 в объект типа Person?
Ответы
Ответ 1
Ответ @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 liner:
function Person(){
if(arguments[0]) for(var prop in arguments[0]) this[prop] = arguments[0][prop];
}
Ответ 2
Нет
Но если вы хотите обработать свой объект person1
, как если бы это был Person
, вы можете вызвать методы на прототипе Person
на person1
с помощью call
:
Person.prototype.getFullNamePublic = function(){
return this.lastName + ' ' + this.firstName;
}
Person.prototype.getFullNamePublic.call(person1);
Хотя это явно не будет работать для привилегированных методов, созданных внутри конструктора Person, как ваш метод getFullName
.
Ответ 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]));
}
Ответ 4
Это взято из нескольких других ответов здесь, но я думал, что это может помочь кому-то. Если вы определяете следующую функцию в своем пользовательском объекте, то у вас есть функция factory, через которую вы можете передать общий объект, и он вернет вам экземпляр класса.
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);