Скажите, что у меня есть следующий код:
var album = new MyObject('album');
Предположите, что, когда объект создается, набор свойств только относительно альбомов загружается через Ajax. Было бы возможно создать Album
класс так, чтобы позже, я могу просто сделать это:
var anotherAlbum = new Album();
Album
конструктор автоматически установил бы свойства, которые уникальны для объектов альбома, на основе того, что было загружено при создании MyObject('album')
«Классы» JavaScript, как и любой другой объект, можно создавать динамически. Так что да, это можно сделать.
Вы бы сделали что-то подобное в коде, обрабатывающем ответ AJAX (при условии, что ответ AJAX предоставил имя нового «класса», и он находится в переменной с именем newClassName):
window[newClassName] = function() {
// New class name constructor code
}
window[newClassName].prototype = {
someProperty: "someValue",
someMethod: function(a, b) {
},
someOtherMethod: function(x) {
}
}
JavaScript - это прототип, а не классический, поэтому, если вы думаете категориями классов, вы делаете это неправильно.
Вам вообще не нужно использовать оператор new
.Вы можете создать новый объект, используя литерал объекта:
var myObject = {attr1: 'val1', attr2: 'val2'};
Затем вы можете создать новый экземпляр этого объекта:
var mySecondObject = Object.create(myObject);
Теперь вы можете изменить атрибуты mySecondObject
, и если у него есть методы, вы можете так же легко их перегрузить:
mySecondObject.attr1 = "Hello";
mySecondObject.attr2 = function() {
return "World!";
};
И тогда mySecondObject
, конечно, будет иметь все свойства, которые вы дали myObject
при создании.
Имейте в виду, что это простая версия, и все атрибуты остаются «общедоступными». Если вам нужна некоторая конфиденциальность, это может быть достигнуто путем добавления некоторых функций в микс. Однако это немного сложнее, поэтому дайте мне знать, если вам интересно ...
Это фактически единственный способ наследования, который есть в 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();
Вы можете использовать шаблон функционального наследования Дугласа Крокфорда. Код из книги «Хорошие части 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 новыми функциями и свойствами. Таким образом, вы можете «на лету» добавлять новые функции и свойства к существующему объекту