Приемлемость открытых полей в JavaScript
Мне просто интересно, допустимы ли в JavaScript открытые поля (то есть те, которые не находятся внутри замыкания конструктора). Хотя обычная мантра гласит: "не используйте открытые поля, используйте методы доступа или свойства", я заметил, что свойства еще не поддерживаются широко во всех браузерах (IE).
Другие языки, сходные по своей сути с JavaScript "все публично", такие как Python, похоже, не слишком заботятся о скрытии информации и открытых полях, даже тех, которые не украшены свойствами. Так можно ли это делать в JavaScript?
пример
"Частный":
var Class = function()
{
var field = null;
this.getField = function() { return field; };
this.setField = function(value) { field = value; };
};
Общественность:
var Class = function()
{
this.field = null;
};
2 ответа
Мы не заботимся о сокрытии публичной информации, так как источник открыт и интерпретируется клиентом на лету.
Свойства не используются (они также медленные), и функции-получатели также редки. Здесь нет private
ключевое слово в Javascript, поэтому оборачивать каждый общедоступный объект в пару методов getter / setter было бы излишним.
Просто запишите свойства ваших объектов.
Это обычная практика, может быть, даже соглашение, префикс внутренних свойств с _
указать, что они не предназначены для изменения или проверки вызывающими абонентами.
Например:
function Foo() {
this._meta = {}; // internal use only
this.prop2 = {}; // public use ok
}
Foo.prototype.meta = function(key, val) {
if (val !== undefined) {
this._meta[key] = val;
} else {
return this._meta[key];
}
};
Этот код показывает публичный метод meta
и внутренняя собственность _meta
, К этому свойству можно получить доступ, но разработчики должны понимать, что, если они изменят его, они могут испортить состояние.
JavaScript - это JavaScript, а не любой другой язык. Люди, пришедшие с Java, склонны считать, что все должно работать как Java. Это неверно. JavaScript на самом деле настолько далек от Java, что некоторые из его структурных правил похожи. JavaScript - это ориентированный на прототип, слабо типизированный функциональный язык, и поэтому он может имитировать Java до некоторой степени, но нет никаких причин, почему он должен это делать. Вообще говоря, если вы не найдете кросс-язык, здравый смысл для определенной мантры относительно JavaScript, игнорируйте ее.