В чем преимущество использования функции конструктора в объекте JavaScript? - PullRequest
0 голосов
/ 19 июня 2009

В чем преимущество использования функции конструктора, например:

var MyLibrary = new function(){
    var self = this;
    self.MyLibrary = function(){
         // init code
    }

}

Вместо того, чтобы просто писать код внутри объекта?

var MyLibrary = new function(){
    // init code
}

Ответы [ 2 ]

3 голосов
/ 19 июня 2009

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

// Class & Constructor definition
function Rectangle(w,h) {
    this.width = w;
    this.height = h;
}

// Now your class methods go on the prototype object
Rectangle.prototype.area = function() {
    return this.width * this.height;
}

Теперь для использования этого класса:

var myRect = new Rectangle(3,4);
myRect.area();

Вы также можете определить класс, сохранив «конструктор» в var, используя анонимные функции вместо именованных функций:

// Class & Constructor definition
var Rectangle = function(w,h) {
    this.width = w;
    this.height = h;
}

// Now your class methods go on the prototype object
Rectangle.prototype.area = function() {
    return this.width * this.height;
}
3 голосов
/ 19 июня 2009

Что ж, если вы используете наследование прототипов для создания новых классов, вы сделаете что-то вроде этого:

function MyBaseClass() {
    // common stuff here
}

function MySubClass() {
    // subclass-specific stuff here
}

MySubClass.prototype = new MyBaseClass();

Эта последняя строка требуется для установления цепочки наследования. Тем не менее, он также имеет побочный эффект выполнения тела MyBaseClass, что может вызвать проблемы (особенно если функция MyBaseClass ожидает аргументы).

Если вы не хотите, чтобы это произошло, сделайте что-то вроде этого:

function MyBaseClass() {
    this.init = function() {
        // initialisation stuff here
    }
    // common stuff here
}

function MySubClass() {
    // subclass-specific stuff here
    this.init();
}

MySubClass.prototype = new MyBaseClass();

Код инициализации в init теперь выполняется только при создании экземпляра MySubClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...