С прототипным наследованием JavaScript не происходит никакой магии.
Student
по-прежнему является функцией, а p
является локальной для этой функции. К нему никак нельзя получить доступ из внешнего кода. method
может получить доступ к p
, поскольку он определен внутри Student
и, следовательно, образует замыкание, но method1
объявлен вне области действия Student
.
Присвоение функции прототипу другой функции не может предоставить ей доступ к ее локальным переменным.
Рассмотрим этот пример:
var p = 41;
function foo() {
console.log(p);
}
function Student(){
var p = 10;
};
Student.prototype.bar = foo;
var s = new Student();
s.bar();
foo();
Вы можете подумать, что, поскольку foo
вызывается как метод объекта, он может иметь доступ к локальным переменным, но это не так. Единственное значение, которое определяется динамически, это this
, это специальное ключевое слово. Все остальные переменные строго определены в цепочке областей действия.