2015-01-20 4 views
0

Я использовал следующий метод для определения экземпляров объектов без определения классов:Экземпляр объекта без определения класса

var obj = new function() { 
 
    this.x = 25;    // Public variable 
 
    var y = 10;     // Private variable 
 

 
    this.print = function() { // Public function 
 
    alert(this.x + y);  
 
    } 
 
} 
 

 
obj.print();

ли это какие-либо недостатки по сравнению с другими образцами модулей? (Для JSLint говорит odd construct at line 1)

+0

какой смысл создать только один экземпляр без возможности создать больше? –

+0

Код является частью моей игры http://meghprkh.github.io/samehue/, где классы, такие как Manager, Input Manager, Display Manager, создаются только один раз, но они помогают выделить код в виде пространств имен. –

+1

Общая практика заключается в том, чтобы использовать функции самоисполнения для этого –

ответ

1

Если вам просто нужны агрегированные области, используйте прямоприменяемые Анонимные функции:

var obj = (function() { 
    var y = 10;     // Private variable 

    return { 
    x: 25,     // Public variable 

    print: function() {  // Public function 
     alert(this.x + y);  
    } 
    } 
})(); 

obj.print(); 

The отличия между прямоприменяемыми анонимными функциями и созданием экземпляром анонимного класса только в идеологии , SEAF - это один раз, и класс предназначен для многократного использования. Кстати, одно и то же происходит в обоих случаях. Когда вы вызываете функцию new, она возвращает новый объект со свойствами this, это то же самое, что мы можем видеть в SEAF.

+0

Как я спросил до того, какие достоинства этого метода над моей? –

+0

@MeghParikh обновленный –

0

Когда вы устанавливаете print непосредственно на объект (с this.print), вы используете некоторую память для хранения свойства (здесь метода) для каждого объекта (создание экземпляра вашего класса). Когда вы определяете его на прототипе, все экземпляры будут иметь одно и то же свойство (так же, как и в той же памяти).

У вас также возникнут проблемы с использованием inheritance.

Если вам нужен только один экземпляр вашего «класса», вы должны использовать шаблон singleton. Но для более мощного решения я бы предложил вам попробовать фреймворк, реализующий компонент инъекции зависимостей, потому что singleton is almost an anti-pattern. Пример такого вида фреймворка можно найти по ссылке в моем профиле (вы не можете использовать его без сервера node.js, но это хороший пример).

Наконец, вы можете определить свой класс, как следующее:

var Class = function() { 
 
    this._x = 25;    // Public variable 
 
    this._y = 10;    // Private variable 
 
} 
 

 
Class.prototype.print = function() { 
 
    alert(this._x + this._y); 
 
} 
 

 
Object.defineProperty(Class.prototype, 'x', { 
 
    get: function() { return this._x; } 
 
}); 
 

 
var obj = new Class(); 
 
obj.print(); 
 

 
alert(obj.x); 
 
alert(obj.y);

+0

Как '' 'частная переменная? Попробуйте добавить 'alert (obj._y)' до конца. –

+1

Существует нет чистого и простого способа определить частную собственность. Я лично использую _ для указания частной собственности и установки для нее доступа для определения ее доступности. Но, конечно, это не гарантирует, что кто-то использует свойство _ вместо этого. Я обновил свой ответ. – Gnucki

+0

Я думаю, что вещь о памяти также встречается в самоисполняющихся анонимных функциях, но я не уверен в вашем методе (хотя я не могу использовать его из-за количества задействованных шаблонов) –

Смежные вопросы