2015-11-09 6 views
2

Когда мы объявляем метод в объекте прототипа, у нас просто есть одно место в памяти, в котором мы можем позже ссылаться на методы, однако используя идею private методов, мы будем повторно создавать методы в памяти каждый раз, когда мы создаем нового ребенка.Закрытые методы внутри конструктора (Javascript, плохая идея?)

Просто ради визуального взглянуть на обоих ниже структур:

function Person(firstname, lastname){ 
    this.firstname = firstname, 
    this.lastname = lastname 
} 

Person.prototype.getFullName = function() { 
    return this.firstname + ' ' + this.lastname; 
} 

var ham = new Person('Hamoodi', 'Josef'); 

Okay поэтому выше код создает метод и сохраняет его в пределах нашего объекта-прототипа, большой материал.

function Person(firstname, lastname){ 
    this.firstname = firstname, 
    this.lastname = lastname, 

    this.getFullName = function() { 
     return this.firstname + ' ' + this.lastname; 
    } 
} 

от того, что я понял (поправьте меня, если я ошибаюсь), это как я создать частный метод, это только кажется, что это плохая идея, если нам нужно создать много детей, или я просто пропущу точку?

Любые мысли?

+2

Это не частный метод ... – epascarello

+0

@epascarello, можете ли вы его отредактировать? Так что я вижу разницу – Hjosef

+0

Посмотрите на шаблон модуля – epascarello

ответ

3

Нет ничего частного в том, как вы определили getFullName. Он будет доступен для любого экземпляра Person и скопирован для каждого экземпляра. Вот почему методы помещаются в прототип конструктора, чтобы они делились между экземплярами.

Если бы вы были действительно есть частные функции внутри вашего конструктора, это будет выглядеть примерно так:

function Person(firstname, lastname){ 
    // bind the function to this instance 
    var getFullName = (function() { 
     return this.firstname + ' ' + this.lastname; 
    }).bind(this); 

    this.firstname = firstname; 
    this.lastname = lastname; 
    // call private function and set property 
    this.fullName = getFullName(); 
} 

Это опять-таки страдает негативное влияние, что каждый экземпляр будет создавать свою собственную копию этого частного метода (но по крайней мере на этот раз его объем фактически является частным).

Частные методы обычно имеют смысл как методы «полезности». Например, рассмотрим следующее:

// your javascript file 
(function (global) { 

    // private scope 
    var id = 0, 
    getId = function() { 
     return ++id; 
    }; 

    function Person(firstname, lastname) { 
     // call private method to get id 
     this.id = getId(); 
     this.firstname = firstname; 
     this.lastname = lastname; 
    } 

    // expose globally 
    global.Person = Person; 

}(window)); 

Теперь, когда кто-то использует свой API для создания нового человека, он использует приватно доступную функцию GetId присвоить уникальный идентификатор для этого человека. Надеюсь, это продемонстрирует, когда вы подумаете о том, как использовать публичный доступ к прототипу с использованием методов private state vs.

+0

Красиво сделано! Я печатал пример шаблона откровения. У вас намного элегантнее. – inspired

+0

Фантастический, спасибо за объяснение, очень полезно! – Hjosef

0

Один из способов получить частные методы в данном модуле - это просто определить их в области, недоступной другим пользователям API.

Обратите внимание, что это может сделать модульное тестирование проблемой, хотя в Node.js вы можете использовать что-то вроде rewire, чтобы получить доступ к частной функции.

function Person(firstname, lastname){ 
    this.firstname = firstname, 
    this.lastname = lastname, 

    getFullName.call(this); 
} 

function getFullName() { 
    return this.firstname + ' ' + this.lastname; 
} 
Смежные вопросы