Изменение типа объекта в JavaScript

У меня есть массив существующего объекта, определенного с помощью JSON. Объекты, очевидно, относятся к типу объектов. Как связать их с пользовательским типом объекта, чтобы предоставить им определенную функциональность?

5 ответов


способ, который будет работать во всех браузерах, - это либо дополнить каждый элемент массива свойствами и методами, которые вы хотите, либо передать объект конструктору и создать новый объект на основе свойств и методов старого объекта.

или если вы не заботитесь о IE:

var obj = {
    name : "Jeremy"
};

function CustomType() {
    this.name = this.name || "someValue";
    this.greeting = "Hi";
}

CustomType.prototype.sayHi = function() {
    alert(this.greeting + ", " + this.name);
};

obj.__proto__ = CustomType.prototype;
obj.constructor.call(obj);

obj.sayHi();

Я не считаю, что есть какой-либо способ изменить тип объекта после его создания. К счастью, вам, вероятно, на самом деле не нужно менять класс ваших объектов-вы, вероятно, будете удовлетворены предоставлением объектам некоторых новых методов и других функций. (Единственное реальное различие заключается в том, что произойдет, если вы измените класс, а большинство людей не меняют классы во время выполнения кода.)

я буду работать для вас примером. Во-первых, я создам простой объект для представления объектов JSON, которые у вас есть:

var myobj = new Object()
myobj.name = "Fred"

затем я создать класс, который вы хотели бы назначить myobj:

function Speaker() {
    this.speak = function() {
        window.alert("Hello, " + this.name);
    }
}

новый Speaker класс имеет некоторые полезные функции: можно использовать метод speak() для вывода полезной информации:

var s = new Speaker()
s.name = "Sally"
s.speak()

выполнение, которое дало мне сообщение"Привет, Салли". К сожалению, вам не нужен новый объект (например,s) С помощью этой функции, вы хотите существующий объект (myobj), чтобы иметь его. Вот как вы это делаете:

myobj.speak = s.speak

теперь, когда я выполнить это:

myobj.speak()

Я вижу сообщение "Привет, Фред".

подведем итоги: создать объект, который делает то, что вы хотите. Скопируйте все методы (и любые вспомогательные переменные) в новый объект. За исключением некоторых необычных применений наследования, это заставит ваш новый объект вести себя по желанию.


Если вы хотите использовать для них определенный метод, вы можете использовать apply / call.

или можно скопировать методы для пользовательского объекта.

function Object1() {
  this.aValue = "10";
}

function CustomObject() {
  this.customValue = "6";
}

function convertToCustom(obj) {
  var custom = new CustomObject();
  for( var key in obj ) {
    custom[key] = obj[key];
  }
  return custom;
}

var obj = new Object1();
var custom = convertToCustom(obj);

console.log(custom.customValue); // <- 6
console.log(custom.aValue);      // <- 10

Если вам не нужен конструктор, можно сделать так:

Object.assign(new CustomType, {});

в качестве дополнения к ответу Джереми вы можете использовать Object.создать вместо того, чтобы напрямую играть с прото. Вам также понадобится функция "extend".

Итак, учитывая пример Джереми, у вас может быть что-то вроде этого:

var obj = {
name : "Jeremy"
};


function CustomType() {
}

CustomType.prototype.init = function(){
    this.name = this.name || "someValue";
    this.greeting = "Hi";
    return this; //let's make it fluent
}

CustomType.prototype.sayHi = function() {
    console.log(this.greeting + ", " + this.name);
};

function extend(obj, props) { 
    for(prop in props) { 
        if(props.hasOwnProperty(prop)) { 
            obj[prop] = props[prop]; 
        } 
    }
    return obj; //let's make it fluent
}

obj = extend(Object.create(CustomType.prototype), obj).init();

obj.sayHi();