#javascript #scope #lexical-scope #prototype-chain
#javascript #область #лексическая область #цепочка прототипов
Вопрос:
Я создал фрагмент кода javascript, и вот ссылка на визуализатор
function Foo(name) {
this.name = name
this.speak = function() {
console.log(this.name)
}
}
function init() {
function init_() {
var foo = new Foo('foo')
foo.hear = function() {
console.log('i can hear')
}
var bar = new Foo('bar')
bar.look = function() {
console.log('i can look')
}
foo.speak()
bar.speak()
}
init_()
}
init()
У меня есть несколько вопросов:
-
На каком этапе создается объект прототипа, он же
Foo.prototype
? Когда интерпретатор загружаетсяFoo
в глобальную область видимости или когдаnew Foo()
вызывается в первый раз, или на любом другом этапе? В какой лексической области хранится его ссылка? (поскольку в визуализаторе нет такой ссылки) -
Должен
foo
ли иbar
совместно использовать методspeak()
, который принадлежитFoo.prototype
, а не владеет их собственными копиями, как показано в визуализаторе? -
Не связаны ли цепочка прототипов и цепочка областей? Например, когда
foo.speak()
вызывается, сначала мы отслеживаем цепочку областей, чтобы получить значениеfoo
, затем цепочку прототипов, чтобы получитьspeak()
?
Ответ №1:
На каком этапе создается объект прототипа, он же
Foo.prototype
? Когда интерпретатор загружаетсяFoo
в глобальную область?
Да, объект прототипа создается при создании Foo
функции.
В какой лексической области хранится его ссылка? (поскольку в визуализаторе нет такой ссылки)
Вообще нет. Он хранится только в свойстве Foo
.
Должен
foo
ли иbar
совместно использовать методspeak()
, который принадлежитFoo.prototype
, а не владеет их собственными копиями, как показано в визуализаторе?
ДА. Похоже, что этот визуализатор был создан для Python и вообще не поддерживает ссылки на прототипы.
Не связаны ли цепочка прототипов и цепочка областей? Например, когда
foo.speak()
вызывается, сначала мы отслеживаем цепочку областей, чтобы получить значениеfoo
, затем цепочку прототипов, чтобы получитьspeak()
?
Да, да.
Однако обратите внимание, что найденный вами визуализатор не отображает цепочку областей, он отображает только стек вызовов и очень плохо визуализирует лексическую область и замыкания правильно.
Комментарии:
1. Спасибо за ваш ответ, Берги! Просто любопытно, что экземпляр python глубоко копирует все из класса?
2. IIRC, да, классы Python для практических целей копируют всех членов класса в экземпляры. Или только элементы данных? Я немного устал от этого. docs.python.org/3/tutorial/classes.html#method-objects говорит: » Когда ссылаются на атрибут экземпляра, не содержащий данных, выполняется поиск по классу экземпляра».