Dynamiczna funkcja przepisywania może być stosowany jako forma lazy initialization, jednak jest pewien haczyk:
function Foo() {...}
Foo.prototype = {
bar: function() {
//some initialized variables to close over
var a, b, c, ...;
Foo.prototype.bar = function() {
//do stuff with variables
};
Foo.prototype.bar.call(this);
}
};
Podczas gdy ten kod jest stosunkowo prosta do zrozumienia, i będą wykorzystywane jako:
var f = new Foo();
f.bar(); //initializes `bar` function
f.bar(); //uses initialized `bar` function
ma ukryty problem:
var f = new Foo(),
g = {};
//passing by reference before the function was initialized will behave poorly
g.bar = f.bar;
f.bar(); //initializes `bar` function
g.bar(); //re-initializes `bar` function
f.bar(); //uses initialized `bar` function
g.bar(); //re-initializes `bar` function
To z tego powodu, że każdy inicjalizacji potrzebne do funkcji jest zazwyczaj odbywa się za pomocą wzoru modułu:
function Foo() {...}
Foo.prototype = {
bar: (function() {
var a, b, c, ..., fn;
//some initialized variables to close over
fn = function() {
//do stuff with variables
};
return fn;
}())
};
Wzór moduł ma tę wadę, nazywając kod inicjujący natychmiast, ale nie będzie miał problemów związanych z odwołaniem do funkcji.
Dlaczego wystąpiłby stan wyścigu? W JavaScript nie ma wielu jednoczesnych wątków. – mellamokb
Oh duh. Dzięki :) – Alan