Короткий ответ, как сказал Йоханнес, почти всегда # 2. Оба будут существовать только в памяти в одном месте, но методы экземпляра имеют контекст (который в основном является дополнительным скрытым аргументом), который дает им доступ к экземпляру.
Но: Некоторые языки/среды будут создавать экземпляр функции, которая выглядит (с наивным чтением исходного кода), как одна функция несколько раз. Хорошим примером этого является JavaScript: объект функции закрывается над областью, в которой он определен, поэтому, если имеется несколько областей (например, вызываемая функция более одного раза), возникает несколько различных объектов функции. (Интерпретаторы/JIT-ERS может оптимизировать ли дублирует код, но концептуально это и ссылки функции отличаются.)
Вот пример в JavaScript:
function foo() {
alert("hi there");
}
function buildBar(x) {
function bar() {
alert(x);
}
return bar;
}
var f1, f2;
f1 = foo;
f2 = foo;
f1();
// alerts "hi there"
f2();
// alerts "hi there"
alert("f1 === f2 ? " + (f1 === f2));
// alerts "true", there is only one `foo`
var b1, b2;
b1 = buildBar("one");
b2 = buildBar("two");
b1();
// alerts "one"
b2();
// alerts "two"
alert("b1 === b2 ? " + (b1 === b2));
// alerts "false", there are two `bar`s
Это становится актуальным в некоторых реализациях данных «частного» экземпляра в JavaScript, где люди определяют методы экземпляра внутри конструктора (так как buildBar
определяет bar
), поэтому они имеют доступ к закрытым переменным, объявленным в конструкторе. Это имеет желаемый эффект (данные частного экземпляра), но влияние нескольких экземпляров функции - по одному для каждого экземпляра объекта.
Все компиляторы используют (2) – 2010-02-05 09:05:46
Метод №2 звучит гораздо логичнее, чем # 1. – Dor
@Neil, конечно, все? Как вы можете быть так уверены? –