function foo() {
var bar = function() { console.log("i'm a private method"); return 1; };
var iAmAPrivateVariable = 1;
return {
publicMethod: function() { alert(iAmAPrivateVariable); },
publicVariable: bar()
}
}
//usage
var thing = foo()
Это известно как функциональный appoach, так как вы на самом деле используя затворов для инкапсуляции (что это единственный способ сделать это в JavaScript).
В общем, вы не должны делать OO в javascript, это не тот классный язык для него по многим причинам. Подумайте, схема с короткоугольными скобками и полуколонами, и вы начнете писать язык, как профессионалы. При этом, когда-то OO лучше подходит. В тех случаях, выше, как правило, лучше всего
EDIT: принести наследство в смесь
function parent() {
return { parentVariable: 2 };
}
function foo() {
var bar = function() { console.log("i'm a private method"); return 1; };
var iAmAPrivateVariable = 1;
me = parent();
me.publicMethod = function() { alert(iAmAPrivateVariable); };
me.publicVariable = bar();
return me;
}
Это делает вещи немного более complected, но достигает желаемого конечного результата в то же время принимая функциональный подход к концепциям ОО (в этом случае, используя функции декоратора вместо реального наследования). Что мне нравится во всем подходе, так это то, что мы по-прежнему рассматриваем объекты так, как они предназначены, чтобы быть на этом языке - мешок имущества, на который вы можете прикрепить материал по своему усмотрению.
EDIT2:
Просто хотел, чтобы дать кредит, где кредит должен, такой подход очень небольшое упрощение к тому, что Дуг Крокфорд предлагает в Javascript: The Good Parts. Если вы хотите перенести свои навыки js на следующий уровень, я бы очень хотел начать там. Я не думаю, что я так много узнал из такой маленькой книги.
Другое примечание: это дико отличается от того, что вы увидите большую часть времени на большинстве заданий, на которых вы когда-либо будете работать, и часто очень сложно объяснить a), что происходит, и b) почему это это хорошая идея для коллег.
Мне это нравится. Может ли он быть согнутым для обеспечения наследования без использования прототипа? – spender
'bar' станет свойством глобального объекта (' window.bar'), поскольку он не объявлен с помощью оператора 'var' в области функции' foo'. Также в ECMAScript 5 Strict Mode это даст вам «ReferenceError», поэтому всегда используйте 'var' для * declare * переменную;) – CMS
@CMS wow ..., которая была смущающей ... –