2014-12-09 6 views
0

Я хотел бы начать, что я не чувствую себя комфортно с JS.javascript личные участники прототипа

У меня возникла проблема с использованием частных методов в прототипе. Допустим, у нас есть класс Person. Я хочу разоблачить метод greet, но сохранить getName private.

function Person(name) { 
    this.name = name; 
} 

Person.prototype = (function() { 

    function getName() { 
     return this.name; 
    } 

    function greet() { 
     console.log("hello " + getName()); 
    } 

    return { 
     greet: greet 
    } 
})(); 

p = new Person('Szymon'); 
p.greet(); 

выше код не будет работать, как GetName не имеет контекст («это» указывает на окно, где имя не существует).

Мое решение этой проблемы было:

function greet() { 
    console.log("hello " + getName.call(this)); 
} 

однако это получить немного грязный с большим классом.

Это чистый раствор? Я был бы признателен за любые отзывы.

+0

Я думаю, лучшее решение - не беспокоиться о частных и публичных, просто префикс внутренних методов с подчеркиванием. – elclanrs

+0

@Teemu: Это соглашение широко принято и на самом деле не обладает компетенцией. Конечно, вам потребуется определенная компетенция, чтобы решить, когда применение этого соглашения возможно. – Bergi

+1

@kit: Обратите внимание, что терминология «частные члены в прототипе» может быть запутанной. 'getName' is * not * член (свойство), это просто локальная переменная. – Bergi

ответ

0

Способ, которым вы его написали getName - не метод, а статическая функция. Если вы не хотите, чтобы это был общедоступный метод (я не вижу веской причины, почему геттер будет закрыт), и вы не хотите использовать .call(), вам нужно будет передать экземпляр явно:

Person.prototype = (function() { 

    function getName(self) { 
     return self.name; 
    } 

    function greet() { 
     console.log("hello " + getName(this)); 
    } 

    return { 
     constructor: Person, 
     greet: greet 
    } 
})(); 

Я считаю, что все три решения одинаково чисты.

+0

«Я не вижу веской причины, почему геттер будет закрыт», это просто пример. JS не мой мир, но ни одно решение не кажется мне чистым. – kit

+0

Ну, «чистый» JS просто имеет все как свойства и вообще не использует конфиденциальность. Поскольку конфиденциальность будет трудно защищать на таком динамичном языке, как JS, в любом случае. – Bergi