2015-01-20 4 views
0

Так что я смог получить доступ к частной переменной (numb) случайно через прототипное наследование. У меня есть несколько вопросов:Почему возможен доступ к частной переменной в другой области с помощью прототипического наследования?

  1. не должны эти частные переменные в самоосуществляющийся анонимной функции (SIAF) закрытия уже истек уже после завершения выполнения SIAF? Я ожидал, что ошибка будет из-за 'use strict'.

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

Вот код:

'use strict'; 

var GLOBAL = {}; 


// SELF-INVOKING ANONYMOUS FUNCTION 
(function(){ 

    var numb = 110; 
    var Person = function(first_name, last_name) { 
     this.name = first_name + ' ' + last_name; 
    }; 

    Person.prototype.getNumb = function() { return numb; }; 

    GLOBAL.Person = Person; 
})(); 


// ANOTHER SELF-INVOKING ANONYMOUS FUNCTION 
(function(){ 
    function Animal(type_of_animal) { 
     this.type = type_of_animal; 
    } 

    Animal.prototype = Object.create(GLOBAL.Person.prototype); 
    GLOBAL.Animal = Animal; 
})(); 



var dog = new GLOBAL.Animal('dog'); 
console.log(dog.getNumb()); // This logs 110 to the console. 

Вот скрипку: http://jsfiddle.net/6w2L1y5w/1/

+1

Вот как работают замыкания, поскольку вы ссылаетесь на 'numb'. Обратите внимание, что вы повторно используете 'numb' для каждого экземпляра. – elclanrs

+0

Код работает полностью, как ожидалось. 'getNumb' - это закрытие, доступ к переменным из области SIAF, независимо от того, вызвано ли оно. – Bergi

ответ

2

Область видимости переменной в JavaScript, является лексическое. Это означает, что область точно такая же, как написано в источнике. Функция getNumb определена в той же лексической области, что и переменная numb, и ее тело ссылается на эту переменную (return numb). Неважно, как и с какой целью вы вызываете эту функцию. Так работают затворы.

На самом деле, это как «привилегированные аксессоры» реализованы в Javascript: у вас есть один «частные» переменные и один «общественность» функция, которая имеет доступ к этому переменному через прицел она определена в

. (Я использую множество «цитат» вокруг «частных» и «публичных» здесь, поскольку они являются традиционными концепциями видимости ООП, которые только смутно переводят на Javascript. Javascript имеет простой лексический диапазон переменных, период. «Конфиденциальность» и это просто применяя этот механизм обзора в определенных моделях для эмулирования семантики ООП класса.)