После прочтения наследования 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, но имеющих опыт в объектно-ориентированном программировании на других языках, надеюсь, это ответило на некоторые вопросы, которые у вас могли возникнуть.
Теперь иди создавать объекты!