Приемлемость открытых полей в 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, игнорируйте ее.

Другие вопросы по тегам