в javascript, как вы можете добавить / выполнить новый метод для объекта, используя частные методы? - PullRequest
1 голос
/ 18 июля 2011

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

например:

var Klass = function() {
        var privateFn = function() { return 15 };
        this.publicFn1 = function() { return privateFn()+1; };
}

var k = new Klass();
console.log( k.publicFn1() );  // prints 16

предположим, что я хочу создать и / или выполнить новый метод в Klass, sum2(), который добавит 2 к privateFn.

пытались умереть с умом

k.publicFn2 = function() { return privateFn()+2 }
console.log( k.publicFn2() );

, и вполне логично, что это не работает, но что делает?

как примечание, так какфункции очень длинные, пытаясь сохранить синтаксис privateFn() вместо self.privateFn() - это может требовать слишком много, но можно надеяться.

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

В ECMAScript нет такой вещи, как приват

var Klass = function() {
        var privateFn = function() { return 15 };
        this.publicFn1 = function() { return privateFn()+1; };
}

privateFn - это локальная переменная, к которой publicFn1 имеет доступ из-за правил области видимости (и замыканий).

Вы не можете получить доступ privateFn вне области действия Klass

Если вы хотите получить доступ к privateFn вне области действия функции Klass, то вам необходимо открыть его через прокси-сервер или внедрить его дальше по цепочке областей действия.

Прокси будет что-то вроде

this._private = function() {
  return privateFn;
}

Внедрение дальше в цепочку прицелов было бы что-то вроде

var Klass = function() {
    var privateFn = function() { return 15 };
    this.publicFn1 = function() { return privateFn()+1; };
    this.uid = Klass.uid++;
    Klass.instances[this.uid] = {
        privateFn: privateFn
    };
}
Klass.uid = 0;
Klass.instances = [];

k.publicFn2 = function() { return Klass.instances[this.uid].privateFn()+2 }

Оба безобразны.

Причина, по которой они уродливы, в том, что вы подражаете классическому ОО

Пожалуйста, используйте вместо этого прототип OO.

Бессовестный прототип OO-штекер

1 голос
/ 18 июля 2011

Javascript - это объектно-ориентированный язык на основе прототипов.Это означает, что если вы хотите использовать переменные, специфичные для экземпляра, вы можете сделать это, расширив объект-прототип этого объекта.Использование его любым другим способом неестественно и приводит к таким проблемам, как ваша, для преодоления которых требуется экстремальный взлом.Почему бы просто не использовать язык, как это было задумано?

Правильная структура вашего кода будет выглядеть примерно так:

function Klass(nr) {
    this.nr = nr;
};

Klass.prototype.publicFn = function() {
    alert(this.nr);
};

var inst = new Klass(13);
inst.publicFn();

В JS нет частных функций, и их не будет.Вы можете «взломать» подобный эффект, но ценой либо взлома чего-либо самостоятельно, либо использования других библиотек.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...