Yeni anahtar kelime

Bir işlevin new ile çağrılması, söz konusu nesnenin "kurucusu" olarak çağrılan işlevin kullanıldığı yeni bir nesne oluşturur:

function MyFunction() {}
const myObject = new MyFunction();

typeof myObject;
> "object"`

Bu, bir "kurucu fonksiyonu"nun, aynı yapısal kalıbı izleyen nesnelerin oluşturulması için bir şablon sağlamasını sağlar:

function MyFunction() {
  this.myProperty = true;
}
const myObject = new MyFunction();

myObject.myProperty;
> true

Oluşturucu işlevi içindeki this değeri, oluşturulan nesneyi ifade eder ve oluşturma sırasında nesnenin özellikler ve yöntemlerle doldurulmasına izin verir. Bu, veri değerleri ve bu veriler üzerinde tek bir taşınabilir birim gibi işlem yapmak için gereken yöntemleri içeren nesnelerin oluşturulmasına olanak tanır. Bu, "kapsülasyon" adı verilen bir kavramdır:

function MyFunction( myArgument ) {
    this.myValue = myArgument;
    this.doubleMyValue = () => myArgument * 2;
}
const myObject = new MyFunction( 10 );

myObject.myValue;
> 10

myObject.doubleMyValue();
> 20

this, bir işlevin mevcut yürütme bağlamını ifade eder. Diğer bir deyişle, kurucu işlevi diğer işlevlerle aynı kuralları this değeri için izler. Örneğin, kurucu olarak tasarlanan bir işlev, bağımsız olarak çağrıldığında this değeri için genel bağlama kullanır:

function MyFunction() {
    console.log( this  );
}
const myObject = new MyFunction();
> MyFunction { }

MyFunction(); // Global `this` binding outside of strict mode is `globalThis`
> Window { … }

(function() {
    "use strict";
    function MyFunction() {
            console.log( this );
    }
    MyFunction();  // Global `this` binding inside of strict mode is `undefined`
}());
> undefined

Bir yapıcı işlevi tanımlayıcısının ilk karakterine büyük harfle başlamak, JavaScript'in yerleşik fabrika işlevleri tarafından oluşturulan adlandırma kalıbına göre gelenekseldir. Bu terimlerin bazen birbirinin yerine kullanıldığını görebilirsiniz. Ancak kurucu işlevleri (new anahtar kelimesiyle çağrıldığında yeni oluşturulmuş bir nesne üzerinde hareket etmeyi amaçlayan işlevler), normal çağrıldığında bir nesne açıkça return olarak kullanılan "fabrika işlevleri"nden farklıdır:

function myFunction( myArgument = false ) {
  return { "myProperty" : myArgument };
}
const myObject = myFunction( true );

myObject;
> Object { myProperty: true }

Temel ilkeler aynı olsa da özel oluşturucu işlevlerinin kullanım alanları, ES6'da kullanıma sunulan tam özellikli Class söz dizimiyle daha iyi sunulur.