Czy można zrobić new new A w js z {x1}}? Jaka jest wtedy żądana struktura?

2
polkovnikov.ph 13 sierpień 2014, 17:04

2 odpowiedzi

Najlepsza odpowiedź

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.

4
14 sierpień 2014, 03:54

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.

0
joews 13 sierpień 2014, 13:11