2014-06-05 23 views
6

Yerleşik JavaScript nesneleri ve yapıcılarla oynamak, biraz tuhaf bir şey fark ettim.Ne zaman * dahili * üzerinde yeni çalışma * kullanılmıyor?

Bazen, new olmadan bir yapıcıyı arayarak yeni nesneler almak mümkündür. Örneğin:

> new Array(1,2,3,4) 
[1, 2, 3, 4] 
> Array(1,2,3,4) 
[1, 2, 3, 4] 

Ancak bazen bu işe yaramazsa:

> Date() 
"Thu Jun 05 2014 00:28:10 GMT-0600 (CST)" 
> new Date() 
Date 2014-06-05T06:28:10.876Z 

ECMAScript şartnamede yerde tanımlanmış olmayan yeni yapıcı yerleşik fonksiyonların davranış mı? Bu davranış aslında yararlı olduğunu unutmayın; Bir dizinin seyrek olmayan bir kopyasını Array.apply(arr)'u arayarak yapabilirim, ancak çapraz platform olsaydı bunu yapmanın rahatlığını hissederdim.

+0

benzer cevabı olan bir diğer ilgili soru: http://stackoverflow.com/questions/1978049/what-values-can-a-constructor-return-to-avoid-returning-this –

+0

Not: 'Tarih () === new Tarih(). toString() ' –

+0

[JavaScript'te Array (1) ve new Array (1) arasındaki fark nedir?] (http://stackoverflow.com/questions/5827008/whats-the- array1-and-new-array1-in-javascript arasındaki fark) – Habib

cevap

1

Yerel yöntemin davranışı, EcmaScript belirtimine bağlıdır. Datethe spec için

diyor ki: Geçerli saati (UTC) temsil eden bir dize döndürür o

tarihi bir fonksiyonu olarak yerine yapıcı olarak adlandırılır

.

NOT: işlev çağrısı Tarih (...) aynı argümanlarla nesne oluşturma ifadesi yeni tarihi (...) için eşdeğer değildir.

ve Dizi bir fonksiyonu olarak yerine yapıcı olarak adlandırılır Arrayspec says

için

, bu oluşturur ve yeni bir Array nesnesi başlatır.

Böylece işlev çağrısı Array (...) nesne oluşturma ekspresyonu yeni Array (...), aynı argüman için eşdeğerdir.

Yani ya new anahtar kelime olmadan nasıl çalıştığını kullandığınız hangi yöntem tamamen bağımlı olduğunu ve yeni anahtar sözcüğü olmadan çağrıldığında neler Spec diyor gerçekleşmesi gerekir.

Örneğin, Matematik nesne daha

Matematik amacı [[Construct]] dahili özelliği yoktur farklıdır; , işlecine sahip bir operatör olarak Math nesnesini kullanmak mümkün değildir.

+0

Tüm yerleşiklerin davranışlarını işlevler ve kurucular olarak ekleyebilirsiniz (çok fazla değil). Spesifikasyon referansı çok güzel. – user3629476

+1

@ user3629476 - Tarih, Dizi, Nesne, Dize, Sayı, Boolean, Matematik, RegExp vb. Var. Birkaç tane var, ve spec herşeyi söylüyor. cevabı daha iyi yapar mı? – adeneo

+0

Üstelik, ES6, ES7 vb. –

1

Evet, ECMA-262 veya new anahtar kelime olmadan çağrıldığında kurucular davranması nesne nasıl tanımlıyor (ı referans için 5.1 Sürümü kullanıyorum).Array için

:

15.4.1 The Array Constructor Called as a Function: Array bir fonksiyonu olarak yerine yapıcı, yarattığı olarak adlandırılan ve yeni bir Array nesnesi başlatırken edilir

. Böylece Array(…) işlev çağrısı, aynı argümanlarla nesne oluşturma ifadesi new Array(…)'a eşdeğerdir.

15.4.2 The Array Constructor

:

Array bir new ifadesi bir parçası olarak adlandırılır

, bir yapıcı: bu yeni oluşturulan nesne başlatır. Date için

:

15.9.2 The Date Constructor Called as a Function:

Date bir fonksiyonu olarak yerine bir yapıcı olarak adlandırılır

, mevcut saat (UTC) temsil eden bir String'i geri gönderir.
Date(…) işlev çağrısı, aynı bağımsız değişkenlere sahip nesne oluşturma ifadesi new Date(…) ile eşdeğer değildir.

15.9.3 The Date Constructor

:

Date bir anlatım bir parçası olarak adlandırılır

, bir yapıcı: bu yeni oluşturulan nesne başlatır.

İlgili konular