Изменение типа объекта в JavaScript
-
02-10-2019 - |
Вопрос
У меня есть массив существующего объекта, определенного JSON. Объекты, очевидно, из типа объекта. Как связать их с пользовательским типом объекта, чтобы дать им конкретные функциональные возможности?
Решение
То, как будет работать во всех браузерах, - это либо дополнять каждый элемент в массиве со свойствами и методами, которые вы хотите, или передавать объект к конструктору и создать новый объект, основанный на свойствах и методах старого объекта.
Или если вам все равно, т.е.
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()
Я вижу сообщение "Привет, Фред".
Обобщить: Создайте объект, который вы хотите. Скопируйте все методы (и любые переменные помощника) в ваш новый объект. За исключением некоторого необычного использования наследства, это сделает ваш новый объект по желанию.
Если вам не нужен конструктор, вы можете сделать как:
Object.assign(new CustomType, {});
Если вы хотите использовать определенный метод на них, вы можете использовать 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.Create, а не напрямую играть с прото. Отказ Вам также понадобится функция «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();