Подтвердить что ты не робот

Можем ли мы наложить общий объект на пользовательский тип объекта в javascript?

Например, у меня уже есть этот объект где-то в коде, это общий объект:

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

У меня есть конструктор для объекта Person:

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

Есть ли простой синтаксис, который позволяет нам преобразовать person1 в объект типа Person?

4b9b3361

Ответ 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];
}

jsfiddle

Ответ 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);