У меня есть массив существующего объекта, определенного с JSON. Объекты, очевидно, имеют Тип объекта. Как я связываю их с типом пользовательского объекта, чтобы дать им определенную функциональность?
Способ, который будет работать во всех браузерах, - это либо дополнить каждый элемент в массиве необходимыми свойствами и методами, либо передать объект конструктору и создать новый объект на основе свойства и методы старого объекта.
Или, если вас не волнует 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()
я вижу сообщение « Hello, Fred ».
Подводя итог: создайте объект, который делает то, что вы хотите. Скопируйте все методы (и любые вспомогательные переменные) в ваш новый объект. За исключением некоторых необычных применений наследования, это заставит ваш новый объект вести себя так, как нужно.
Если вы хотите использовать для них определенный метод, вы можете использовать команду 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