Вы подходите для a
и b
:
a
- это аргумент, доступный только в рамках функции конструктора .
b
является общедоступной переменной экземпляра, доступной во всех экземплярах, созданных с помощью этой функции конструктора.
c
является закрытой переменной, доступной только внутри функции конструктора.
Объявление d
недопустимо, поскольку объект prototype
предназначен для использования только в функциях конструктора , например Clazz.prototype.d = 3;
, если вы сделаете это так, переменная будет разделена , но вы можете присвоить значение конкретному экземпляру, и значением по умолчанию будет shadowed (через цепочку прототипов).
Для «приватных переменных» вы можете использовать способ объявления c
, например:
function Clazz(){
var c = 3; // private variable
this.privilegedMethod = function () {
alert(c);
};
}
Привилегированные методы общедоступны, но они могут обращаться к "закрытым" переменным, объявленным внутри функции конструктора.
Для создания синглетонов, возможно, проще всего использовать литерал объекта, например:
var myInstance = {
method1: function () {
// ...
},
method2: function () {
// ...
}
};
А если вы хотите, чтобы в вашем экземпляре синглтона были приватные участники, вы можете:
var myInstance = (function() {
var privateVar = '';
function privateMethod () {
// ...
}
return { // public interface
publicMethod1: function () {
// all private members are accesible here
},
publicMethod2: function () {
}
};
})();
Это был назван шаблон модуля, он в основном позволяет инкапсулировать приватные элементы в объекте, используя преимущества замыканий .
Подробнее:
Редактировать: О синтаксисе, который вы публикуете:
var mySingleton = new (function() {
// ...
})();
Используя оператор new
, вы объявляете и используете в один шаг" анонимную функцию-конструктор ", которая будет генерировать новый экземпляр объекта, он действителен, но Лично я предпочел бы шаблонный подход «модуль», чтобы создать свой собственный экземпляр объекта (и избегать new
).
Также, читая new function () {}
, я думаю, что это не совсем интуитивно и может создать путаницу, если вы не очень хорошо понимаете, как работает оператор new
.
О скобках, они необязательны, оператор new
вызовет конструктор функции без параметров, если вы не добавите их ( см. ECMA-262 , 11.2.2 ).