Приемлемость открытых полей в JavaScript - PullRequest
3 голосов
/ 09 мая 2011

Мне просто интересно, допустимы ли в JavaScript открытые поля (т. Е. Те, которые не ограничены областью замыкания конструктора). Хотя обычная мантра гласит: «не используйте открытые поля, используйте методы доступа или свойства», я заметил, что свойства еще не поддерживаются широко во всех браузерах (IE).

Другие языки, аналогичные по своей сути «JavaScript всем», как, например, Python, не слишком заботятся о скрытии информации и открытых полях, даже тех, которые не украшены свойствами. Так можно ли это делать в JavaScript?

Пример

"Личное":

var Class = function()
{
    var field = null;
    this.getField = function() { return field; };
    this.setField = function(value) { field = value; };
};

Public:

var Class = function()
{
    this.field = null;
};

Ответы [ 2 ]

5 голосов
/ 09 мая 2011

Мы не заботимся о сокрытии публичной информации, так как источник открыт и интерпретируется клиентом на лету.

Свойства обычно не используются (они также медленные), а функции получения также редки.В Javascript нет ключевого слова private, поэтому обертывание каждого общедоступного объекта в паре методов 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.К этому свойству можно получить доступ, но разработчики должны понимать, что, если они изменят его, они могут испортить состояние.

1 голос
/ 09 мая 2011

JavaScript - это JavaScript, а не любой другой язык. Люди, пришедшие с Java, склонны считать, что все должно работать как Java. Это неверно. JavaScript на самом деле настолько далек от Java, что некоторые из его структурных правил похожи. JavaScript - это ориентированный на прототип, слабо типизированный функциональный язык, и как таковой он может до некоторой степени имитировать Java, но нет никаких причин, почему это следует делать. Вообще говоря, если вы не найдете кросс-язык, здравый смысл для определенной мантры относительно JavaScript, игнорируйте ее.

...