Динамично создавая новый класс JavaScript из существующего объекта

Скажите, что у меня есть следующий код:

var album = new MyObject('album');

Предположите, что, когда объект создается, набор свойств только относительно альбомов загружается через Ajax. Было бы возможно создать Album класс так, чтобы позже, я могу просто сделать это:

var anotherAlbum = new Album();

Album конструктор автоматически установил бы свойства, которые уникальны для объектов альбома, на основе того, что было загружено при создании MyObject('album')

8
задан jd. 26 February 2010 в 15:03
поделиться

4 ответа

«Классы» JavaScript, как и любой другой объект, можно создавать динамически. Так что да, это можно сделать.

Вы бы сделали что-то подобное в коде, обрабатывающем ответ AJAX (при условии, что ответ AJAX предоставил имя нового «класса», и он находится в переменной с именем newClassName):

window[newClassName] = function() {
  // New class name constructor code
}

window[newClassName].prototype = {

  someProperty: "someValue",

  someMethod: function(a, b) {
  },

  someOtherMethod: function(x) {
  }
}
4
ответ дан 5 December 2019 в 11:23
поделиться

JavaScript - это прототип, а не классический, поэтому, если вы думаете категориями классов, вы делаете это неправильно.

Вам вообще не нужно использовать оператор new .Вы можете создать новый объект, используя литерал объекта:

var myObject = {attr1: 'val1', attr2: 'val2'};

Затем вы можете создать новый экземпляр этого объекта:

var mySecondObject = Object.create(myObject);

Теперь вы можете изменить атрибуты mySecondObject , и если у него есть методы, вы можете так же легко их перегрузить:

mySecondObject.attr1 = "Hello";

mySecondObject.attr2 = function() {
                           return "World!";
                       };

И тогда mySecondObject , конечно, будет иметь все свойства, которые вы дали myObject при создании.

Имейте в виду, что это простая версия, и все атрибуты остаются «общедоступными». Если вам нужна некоторая конфиденциальность, это может быть достигнуто путем добавления некоторых функций в микс. Однако это немного сложнее, поэтому дайте мне знать, если вам интересно ...

9
ответ дан 5 December 2019 в 11:23
поделиться

Это фактически единственный способ наследования, который есть в JavaScript. В JavaScript есть прототипическое наследование (которое можно использовать для воссоздания классического наследования). Это означает, что наследование происходит от другого объекта, а не от определения класса.

Создать объект, обладающий всеми свойствами другого объекта, очень просто:

function Album() {
   // do whatever initialization you need to here, all the properties of album 
   // are available on 'this'
   // e.g.,
   doSomething(this.albumName);
}
Album.prototype = album;

var anotherAlbum = new Album();
3
ответ дан 5 December 2019 в 11:23
поделиться

Вы можете использовать шаблон функционального наследования Дугласа Крокфорда. Код из книги «Хорошие части Javascript»

var mammal = function (spec) {
    var that = {};

    that.get_name = function (  ) {
        return spec.name;
    };

    that.says = function (  ) {
        return spec.saying || '';
    };

    return that;
};

var myMammal = mammal({name: 'Herb'});


var cat = function (spec) {
    spec.saying = spec.saying || 'meow';
    var that = mammal(spec);
    that.purr = function (n) {
        var i, s = '';
        for (i = 0; i < n; i += 1) {
            if (s) {
                s += '-';
            }
            s += 'r';
        }
        return s;
    };
    that.get_name = function (  ) {
        return that.says(  ) + ' ' + spec.name +
                ' ' + that.says(  );
    return that;
};

var myCat = cat({name: 'Henrietta'});

Он использует функции для украшения существующих объектов javascript новыми функциями и свойствами. Таким образом, вы можете «на лету» добавлять новые функции и свойства к существующему объекту

1
ответ дан 5 December 2019 в 11:23
поделиться
Другие вопросы по тегам:

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