Що означає цей підкреслення в Javascript?


85
var Gallery = Backbone.Controller.extend({
    _index: null,
    _photos: null,
    _album :null,
    _subalbums:null,
    _subphotos:null,
    _data:null,
    _photosview:null,
    _currentsub:null,
    routes: {
        "": "index",
        "subalbum/:id": "subindex",
        "subalbum/:id/" : "directphoto",
        "subalbum/:id/:num" : "hashphoto"
    },
    initialize: function(options) {
        var ws = this;
        if (this._index === null){
            $.ajax({
                url: 'data/album1.json',
                dataType: 'json',
                data: {},
                success: function(data) {
                    ws._data = data;
                    ws._photos =
                    new PhotoCollection(data);
                    ws._index =
                    new IndexView({model: ws._photos});
                    Backbone.history.loadUrl();
                }
            });
            return this;
        }
        return this;
    },
    //Handle rendering the initial view for the
    //application
    index: function() {
        this._index.render();
    },

Я читаю підручник з backbone.js тут: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

Які підкреслення? (_index, _photos, _album) Навіщо їх використовувати?


2
підкреслення не мають синтаксичного значення, це, мабуть,
умова

Відповіді:


164

Це означає приватні поля або приватні методи. Методи, призначені лише для внутрішнього використання.

Їх не слід викликати поза класом.

Приватні поля містять дані для внутрішнього використання.

Їх не слід читати чи писати (безпосередньо) поза межами класу.

Примітка: Дуже важливо відзначити, що просто додавання підкреслення до змінної не робить її приватною, це лише дотримання імен.


4
принаймні, ідея приватних полів є, але вони насправді не приватні, ви все одно можете отримати до них доступ. автор вищезазначеного коду просто призначив для них приватність. це все.
Сандер

Дивовижно, не знаю, чому мені знадобилося так багато часу, щоб розглянути це! Дякую.
droid-zilla

21

Наскільки мені відомо, вона, як правило, використовується для позначення приватної змінної (але насправді не забезпечує жодної конфіденційності, лише домовленість).

Це коротко обговорюється тут, хоча їм не рекомендують: http://javascript.crockford.com/code.html


3
Мені подобається посилання: "Уникайте конвенцій, які демонструють недостатню компетентність". :-)
Арек

Я використовую їх як ярлики під час налагодження, особливо з Promises та іншими асинхронними речами. наприклад, "офіційним" способом отримати доступ до якогось атрибуту мого об'єкта може бути, myObj.getSmePromise().then( function(o) { do stuff } );але це myObj._someValueважко вводити на консолі Chrome, тому я зрозумів, що "належний код" насправді не матиме до нього доступу - це, однак, з розкіш моїх співробітників, які також знають цю умову, якщо ви пишете наступний jQuery / lodash / angular / response або що б я не покладався на те, щоб усі ваші користувачі знали або поважали це!
FredL

8

Коли використовується як _varname це просто частина імені змінних, і не має значення javascript. Розробники використовують його для позначення значення або обсягу змінної. У цьому випадку схоже, що він повідомляє розробнику, що ця змінна повинна бути локальною або приватною змінною.

Кілька речей, на які слід звернути увагу, у цьому конкретному прикладі використання _.varnameозначатиме змінну або функцію з бібліотекою underscore.js. Також можна використовувати _varnameдля позначення змінної, що містить об'єкт підкреслення, так само, як у нашому офісі, ми використовуємо $varnameдля позначення змінної, що містить об'єкт Jquery.


4

Ймовірно, він використовується для позначення внутрішніх / приватних властивостей. Подібно до того, як у python префікс змінної з підкресленням є простим способом сказати розробникам, що змінна є внутрішньою, і їм краще не втручатися в неї (і якщо вони це роблять, навіть незначне оновлення задіяної бібліотеки може зламати речі).


2

Зазвичай _використовується, щоб повідомити користувачеві / програмісту, що це приватна / захищена змінна.


0

Як уже згадувалося, це практика серед багатьох розробників, причому погана. Якщо вам доводиться вдаватися до подібних умов у своїх методах програмування, вам слід вивчити мову, методи та шаблони, перш ніж намагатись використовувати мову. Якщо хтось не може розрізнити публічний / приватний методи у вашому коді, не використовуючи "підкреслення", тоді вашої навички документації надзвичайно бракує. Багато публічних проектів в Інтернеті дуже погано задокументовані, імовірно, саме тому конвенції "підкреслення" були "прийняті" більшістю серед освічених розробників, тоді як інші вирішили піти цим шляхом, а не дотримуватися офіційних шаблонів та методів проектування. Існує причина, чому "підкреслення" не було записано у версії ES6 / 7.

У своєму блозі я нещодавно зіткнувся з менеджером програмного інженера, який заявив: " Угода про назви підкреслення дозволяє дуже швидко з першого погляду зрозуміти, чи призначена функція змінної загальнодоступною чи приватною ". Моя відповідь така: "Коментарі схожі на картинки, в цьому випадку вони варті тисячі підкреслень.

Існує безкоштовний інструмент документації під назвою Doxygen. Хоча він спеціально не підтримує JavaScript, він може генерувати професійну документацію для ваших програм JavaScript, коли ви використовуєте префікс Doxygen у своїх коментарях. Створити програми з документацією для розробників та користувачів дуже просто, якщо докласти трохи зусиль до коментарів коду.

Пам’ятайте, що існують інструменти, які можуть видаляти коментарі та консольні оператори для «Випусків виробництва». Тим не менш, використання вихідних карт - це також марна трата часу та ресурсів. Не мініфікуйте, поки не будете готові до публікації .. тобто Dev Build (відсутність мініфікації, зберігайте коментарі та оператори консолі), Release Build (видаляйте коментарі та оператори консолі та мініфікуйте компіляцію Dev. Не потрібно повторно компілювати Dev Build під час його випуску якісний код, просто підготуйте його до випуску та розгорніть).


2
Ви не побачите коментар, якщо не подивитесь на вихідний код функції. Якщо ви використовуєте чужу бібліотеку / код, це додає деяке значення, щоб мати змогу побачити намір методу без читання джерела чи документації. Префікс підкреслення Imo говорить, що це непублічний API, на який не слід покладатися.
Sam P

0

Це невеликий додаток. Як уже відповіли, це псевдо приватні змінні. Але тоді можна писати псевдо загальнодоступні функції, які отримують доступ до цих приватних змінних.

Я заплутався в коді колег, який фактично має це (але захований дуже глибоко в окремій бібліотеці):

class x { 
  constructor(id) {this._id = id} 
  get id() {return this._id}
}
let y = new x(3)

Тепер у вас є y.idі y._idте, і інше , і ви повертаєте однакове значення. Але якщо ви console.log(y)це зробите, відображається лише _idключ.

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.