JavaScript Object.prototype Доступ к частным значениям - PullRequest
1 голос
/ 22 марта 2012

Я читал, что использование Object.prototype для присоединения функций к пользовательским объектам JavaScript более эффективно, чем "традиционный" метод this.foo = function().Проблема, с которой я столкнулся - это сфера.Я хочу, чтобы эти общедоступные методы имели доступ к закрытым переменным объекта.В итоге я сделал следующее:

function Foo(){
    var id = 5;
    Foo.prototype.bar = function(){
        alert(id);
    };
}
var x = new Foo();
x.bar();

Я вложил объявление прототипа в определение объекта.Это работает и, кажется, решить проблему.Есть ли причина НЕ делать этого?Есть ли лучший или более стандартный способ сделать это?

ОБНОВЛЕНИЕ Основываясь на некоторых полученных мною ответах, думаю, мне нужно упомянуть, что я полностью осознаю, что естьнет понятия private переменной в JavaScript.Я использую термин private здесь, означающий недоступность вне текущей области, потому что это легче сказать и написать, и я предполагаю, что любой, кто пытается ответить на этот вопрос, будет знать, что я имел в виду, используя термин private.

Ответы [ 4 ]

1 голос
/ 22 марта 2012

Вы можете использовать привилегированные методы для доступа к закрытым членам.Более подробная информация здесь: http://javascript.crockford.com/private.html

Однако, IMO, это действительно не стоит.Это громоздко и калечит классическое наследство.И для чего?Чтобы «защитить» пользователей от прямого доступа к вашим личным пользователям?Это JS, у них есть источник и средства для доступа к ним в любом случае, это действительно не стоит усилий.Подчеркивание псевдо-частных членов достаточно.

1 голос
/ 22 марта 2012

Пока ваша идея работает, она может работать не так, как вы ожидаете.Я полагаю, что вы перезаписываете прототип каждый раз, когда создается новый Foo.Это потенциально может изменить метод bar() для всех экземпляров Foo каждый раз, когда вы создаете новый Foo.Упс.

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

Вот стандартный способ сделать это:

0 голосов
/ 22 марта 2012

вот как вы можете подделать это.Это звериный класс

(function(window){
        //public variable
        Animal.prototype.speed = 3;

        //public method
        Animal.prototype.run = function(){
            //running
        }

        //private method
        //private method
        function runFaster(){
            //run faster
        }

        //private var
        //private var
        var legCount = 4;    

    }(window));
0 голосов
/ 22 марта 2012

В JavaScript нет приватного, просто делай все правильно

var Foo = {
    bar: function () {
        console.log(this._id)
    },
    constructor: function () {
        this._id = 5
        return this
    }
}

var x = Object.create(Foo).constructor()
x.bar()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...