Изменение типа объекта в 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.создать вместо того, чтобы напрямую играть с прото. Вам также понадобится функция "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();