Вопрос

У меня есть массив существующего объекта, определенного 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top