Так что я смог получить доступ к частной переменной (numb
) случайно через прототипное наследование. У меня есть несколько вопросов:Почему возможен доступ к частной переменной в другой области с помощью прототипического наследования?
не должны эти частные переменные в самоосуществляющийся анонимной функции (SIAF) закрытия уже истек уже после завершения выполнения SIAF? Я ожидал, что ошибка будет из-за
'use strict'
.Если оно предназначено для того, чтобы переменная никогда не заканчивалась, следует ли избегать этого как часть лучшей практики?
Вот код:
'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/
Вот как работают замыкания, поскольку вы ссылаетесь на 'numb'. Обратите внимание, что вы повторно используете 'numb' для каждого экземпляра. – elclanrs
Код работает полностью, как ожидалось. 'getNumb' - это закрытие, доступ к переменным из области SIAF, независимо от того, вызвано ли оно. – Bergi