Czy można zrobić new new A
w js z {x1}}? Jaka jest wtedy żądana struktura?
2 odpowiedzi
Tak, teoretycznie.
function A() {
return function B() {
}
}
> new new A
B {}
Lub
> new new A()
> new new A() ()
Ponieważ nawiasy są opcjonalne za pomocą operatora new
.
Wykorzystuje to fakt, że konstruktor może zwrócić coś innego niż skonstruowany obiekt. Jest to niezwykle niejasne, dlaczego każdy mógłby to zrobić. Nie zmienia się to również faktu, że new
można wywołać tylko na funkcję.
Departament ciekawostek
To
function A() { return A; }
Pozwala to zrobić
new new new new new new new new new new new new A
Co nie ma rdzenia.
Prototype łańcuchy
Wiesz, że nazywa się new
na konstruktorze konstruuje obiekt z prototypem dla tego konstruktora. Jeśli jednak zwrócisz dowolny obiekt inny niż this
z konstruktora, this
, wraz z powiązanym prototypem, jest na zawsze utracone na świecie. Niezależnie od obiektu, który powracasz, ma swój własny prototyp, pochodzącym z gdziekolwiek - nie, że z A. Dotyczy to równie w zależności od przypadku, gdzie konstruktor zwraca funkcję, w takim przypadku odpowiedni prototyp jest Function.prototype
. Czy jest jakiś sposób, aby go zorganizować, w mało prawdopodobnym przypadku, że dbaliśmy, aby new A
nadal zwróci funkcjonowanie funkcjonowania, które możemy zrobić new
, a także mieć dostęp do {{x6 }}?
Nie łatwo. Jeśli chcesz dodatkowe właściwości na function B
zwrócone z new A
, możesz po prostu dodać te właściwości przed powrotem function B
.
Nie, to nie jest możliwe. A
musi być funkcją, niezależnie od jego wartości powrotowej.
Źródło: ECMAScript 5 Spec dla operatora new
:
Jeśli konstruktor nie implementuje metody wewnętrznej [[Construct]], rzuć wyjątek typu APRESEError.
Z Specyfikacja funkcji, widzimy, że { {X0}} to specjalna wewnętrzna (niedostępna) właściwość obiektów funkcyjnych.