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

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

10
задан Ray 2 July 2010 в 15:49
поделиться

3 ответа

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

Или, если вас не волнует 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();
13
ответ дан 3 December 2019 в 17:19
поделиться

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

Я приведу пример для вас. Сначала я создам простой объект для представления имеющихся у вас объектов 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 ».

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

4
ответ дан 3 December 2019 в 17:19
поделиться

Если вы хотите использовать для них определенный метод, вы можете использовать команду 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
2
ответ дан 3 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: