2013-08-21 4 views
4

Следующие действия не работают, из моего получателя я не вижу _nickname, определенного в Person класса.Использование Object.DefineProperty и доступ к переменной в закрытом доступе

var Person = function (args) { 

    var _nickname = ''; 
    if (args === undefined || args === null) { 
     return; 
    } 
    if (args.nickname !== undefined && args.nickname !== null) { 
     _nickname = args.nickname; 
    } 

} 

Object.defineProperty(Person.prototype, "nickname", { 
    get : function() { 
     return _nickname; 
    } 
}); 

var x = new Person({ 
     nickname : 'bob' 
    }); 

console.log(x.nickname); 

Как это сделать? Есть ли способ добавить _nickname к прототипу Person из его функции?

+0

Быстрый совет: 'args === undefined || args === null' то же, что и 'args == null', потому что' null == undefined'. То же самое с другим сравнением. – elclanrs

+0

Ах, да, я был в курсе о JsLint, и ему не нравится ==. Я исправил это. Я не знаю, слишком ли осторожен, но я надеялся, что закрытие JS позаботится об этом :-) – Matt

+3

JSHint - моя чашка чая. У него есть опция только для этого конкретного случая: [eqnull] (http://www.jshint.com/docs/options/#eqnull) – elclanrs

ответ

5

Есть ли способ добавить _nickname к прототипу Person из его функции?

Если вы имеете в виду Person конструктор, конечно (хотя на мой взгляд это не выглядит очень элегантно):

var Person = function (args) { 
    var _nickname = ''; 
    if (args === undefined || args === null) { 
     return; 
    } 
    if (args.nickname !== undefined && args.nickname !== null) { 
     _nickname = args.nickname; 
    } 
    Object.defineProperty(this, "nickname", { 
     get : function() { 
      return _nickname; 
     } 
    }); 
} 

var x = new Person({ 
    nickname : 'bob' 
}); 

console.log(x.nickname); 

http://jsfiddle.net/JEbds/

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

+0

Но не будет Object.defineProperty запускаться каждый раз, когда я делаю «new Person()» ? Или это не очень важно? Этого я и хотел избежать. – Matt

+0

Он делает. Но если вы не запустите его из конструктора, он никогда не сможет получить доступ к '_nickname'. – bfavaretto

+1

@Matt Если вы в порядке, если вы не являетесь частным, вы можете использовать 'this._nickname' (и вы даже можете установить его' writable: false', поэтому значение, заданное в конструкторе, никогда не может быть изменено). http://jsfiddle.net/669Gb/ – bfavaretto

 Смежные вопросы

  • Нет связанных вопросов^_^