Динамическое создание нового класса javascript из существующего объекта - PullRequest
8 голосов
/ 26 февраля 2010

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

var album = new MyObject('album');

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

var anotherAlbum = new Album();

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

Ответы [ 5 ]

9 голосов
/ 26 февраля 2010

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

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

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

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

var mySecondObject = Object.create(myObject);

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

mySecondObject.attr1 = "Hello";

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

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

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

4 голосов
/ 26 февраля 2010

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

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

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

window[newClassName].prototype = {

  someProperty: "someValue",

  someMethod: function(a, b) {
  },

  someOtherMethod: function(x) {
  }
}
3 голосов
/ 26 февраля 2010

На самом деле это единственное наследование, которое имеет 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();
1 голос
/ 26 февраля 2010

Вы можете использовать Шаблон функционального наследования Дугласа Крокфорда. Код из книги хороших запчастей 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 новыми функциями и свойствами. Таким образом, вы можете добавлять новые функции и свойства на лету к существующему объекту

0 голосов
/ 29 июня 2015

Вы можете сделать это

var NewClass=function(){
    this.id=null;
    this.name=null;
    this.show=function(){
        alert(this.id+" "+this.name;
    }
}
NewClass.prototype.clear=function(){
    this.id=null;
    this.name=null;
};

...

var ins1=new NewClass();
var ins2=new NewClass();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...