Статьи

JavaScript: как получить частные, привилегированные, публичные и статические члены

После прочтения наследования JavaScript — как и почему, а также объяснения объема и замыканий JavaScript , я подумал, что мы объединим полученные знания, чтобы поговорить о частных, привилегированных, открытых и статических членах (свойствах и методах) для объектов в JavaScript.

Фон

Для разработчиков, пришедших из сложного объектно-ориентированного опыта, определение и использование таких членов является ключом ко всему написанному коду. Не совсем так, когда вы работаете с JavaScript, но я подумал, что объясню, как использовать такой подход с JavaScript, чтобы сделать ваш код более универсальным.

Собираем наш объект

Мы соберем объект конструктора, из которого вы можете создавать новые экземпляры, используя newключевое слово. Давайте начнем с пустого, чтобы освоить его:

// Constructor
function Kid (name) {
// Empty, for now
}

Теперь вы можете создать столько объектов, сколько захотите, таким образом:

var kenny = new Kid("Kenny");

Добавление частной собственности

Как мы узнали из статьи об области применения и закрытиях JavaScript , объявление переменной внутри функции доступно только изнутри. Итак, если мы хотим частную собственность Kidобъекта, мы делаем это так:

// Constructor
function Kid (name) {
// Private
var idol = "Paris Hilton";
}

idolСвойство будет доступно для кода внутри только Kidфункции / объекта.

Добавление привилегированного метода

Привилегированный метод — это метод, имеющий доступ к закрытым свойствам, но в то же время публично раскрывающий себя (в JavaScript, также из-за области видимости и замыканий JavaScript ). Вы можете удалить или заменить привилегированный метод, но вы не можете изменить его содержимое. Т.е. этот привилегированный метод возвращает значение частного свойства:

// Constructor
function Kid (name) {
// Private
var idol = "Paris Hilton";

// Privileged
this.getIdol = function () {
return idol;
};
}

Добавление публичной собственности и публичного метода

Теперь, когда у нас есть частные и привилегированные члены, давайте посмотрим на самую основную природу открытых свойств и методов:

// Constructor
function Kid (name) {
// Public
this.name = name;
this.getName = function () {
return this.name;
};
}

Свойство nameобщедоступно для любого вызова, как и getNameметод.

Обновить

Как упоминалось в комментариях ниже, этот способ был выбран и показан только для ясности по сравнению с другими типами. Для открытых методов рекомендуется использовать этот prototypeподход, и я обновил код ниже, чтобы отразить это. Например:

// Constructor
function Kid (name) {
// Public
this.name = name;
}
Kid.prototype.getName = function () {
return this.name;
};

 

Узнайте больше об этом в наследовании JavaScript — как и почему .

Добавление статического свойства

Статический член является общим для всех экземпляров класса, а также самого класса (т. Е. KidОбъекта), но он хранится только в одном месте. Это означает, что его значение не наследуется до экземпляров объекта:

// Constructor
function Kid (name) {
// Constructor code
}

// Static property
Kid.town = "South Park";

Наш полный объект

Давайте посмотрим на наш полный объект, прежде чем мы попытаемся получить доступ к его свойствам и методам:

// Constructor
function Kid (name) {
// Private
var idol = "Paris Hilton";

// Privileged
this.getIdol = function () {
return idol;
};

// Public
this.name = name;
}

// Public
Kid.prototype.getName = function () {
return this.name;
};

// Static property
Kid.town = "South Park";

Создание экземпляра и проверка доступа

Теперь, наконец, пришло время проверить, как эти разные подходы работают на практике. Мы начинаем с создания экземпляра Kidобъекта, а затем проверяем, какие различные значения мы получаем обратно. Тесты и их результаты:

// Create a new instance

var cartman = new Kid("Cartman");

// Access private property
cartman.idol; // undefined

// Access privileged method
cartman.getIdol(); // "Paris Hilton"

// Access public property
cartman.name; // "Cartman"

// Access public method
cartman.getName(); // "Cartman"

// Access static property on an instance
cartman.town; // undefined

// Access static property on the constructor object
Kid.town; // "South Park"

Вывод

Я надеюсь, что это был хороший способ разжечь ваше любопытство по поводу ваших различных вариантов, когда речь идет об объектах и ​​их членах! Кроме того, для новичков в JavaScript, но имеющих опыт в объектно-ориентированном программировании на других языках, надеюсь, это ответило на некоторые вопросы, которые у вас могли возникнуть.

Теперь иди создавать объекты!