Ek

Prototip kalıtım

null ve undefined hariç her ilkel veri türünün bir prototipi vardır. Bu prototip, değerlerle çalışma yöntemleri sağlayan ilgili bir nesne sarmalayıcısıdır. Bir ilkel üzerinde bir yöntem veya özellik araması çağrıldığında JavaScript, ilkel nesneyi perde arkasında sarmalayarak yöntemi çağırır ya da bunun yerine sarmalayıcı nesnede özellik aramasını gerçekleştirir.

Örneğin, bir dize değişmez değerinin kendi yöntemi yoktur ancak ilgili String nesne sarmalayıcısı sayesinde üzerinde .toUpperCase() yöntemini çağırabilirsiniz:

"this is a string literal".toUpperCase();
> THIS IS A STRING LITERAL

Buna prototip kalıtım denir. Bu, bir değerin ilgili kurucusundan özellikleri ve yöntemleri devralınmasıdır.

Number.prototype
> Number { 0 }
>  constructor: function Number()
>  toExponential: function toExponential()
>  toFixed: function toFixed()
>  toLocaleString: function toLocaleString()
>  toPrecision: function toPrecision()
>  toString: function toString()
>  valueOf: function valueOf()
>  <prototype>: Object {  }

Bu yapıcıları kullanarak, değerlerine göre tanımlamak yerine ilkel öğeler oluşturabilirsiniz. Örneğin, String kurucusunun kullanılması bir dize değişmezi değil, dize nesnesi oluşturur: Bu nesne, yalnızca dize değerimizi değil, kurucunun devralınan tüm özelliklerini ve yöntemlerini de içerir.

const myString = new String( "I'm a string." );

myString;
> String { "I'm a string." }

typeof myString;
> "object"

myString.valueOf();
> "I'm a string."

Sonuç olarak elde edilen nesneler, çoğu durumda onları tanımlamak için kullandığımız değerler gibi davranır. Örneğin, new Number yapıcısını kullanarak bir sayı değeri tanımlamak Number prototipinin tüm yöntemlerini ve özelliklerini içeren bir nesneyle sonuçlansa da bu nesnelerde matematiksel operatörleri tam sayılarda kullanacağınız gibi kullanabilirsiniz:

const numberOne = new Number(1);
const numberTwo = new Number(2);

numberOne;
> Number { 1 }

typeof numberOne;
> "object"

numberTwo;
> Number { 2 }

typeof numberTwo;
> "object"

numberOne + numberTwo;
> 3

JavaScript'in yerleşik prototip kalıtım özelliği, bu yapıcıların pratik bir fayda sağlamadığı anlamına geldiğinden bu yapıcıları çok nadiren kullanmanız gerekir. Oluşturucuları kullanarak ilkel oluşturmak da beklenmedik sonuçlara yol açabilir. Bunun nedeni, sonucun basit bir değişmez değer değil, bir nesne olmasıdır:

let stringLiteral = "String literal."

typeof stringLiteral;
> "string"

let stringObject = new String( "String object." );

stringObject
> "object"

Bu durum, katı karşılaştırma operatörlerinin kullanımını karmaşık hale getirebilir:

const myStringLiteral = "My string";
const myStringObject = new String( "My string" );

myStringLiteral === "My string";
> true

myStringObject === "My string";
> false

Otomatik noktalı virgül ekleme (ASI)

JavaScript yorumlayıcıları, bir komut dosyasını ayrıştırırken atlanan noktalı virgül örneklerini düzeltmeye çalışmak için otomatik noktalı virgül ekleme (ASI) adlı bir özellik kullanabilir. JavaScript ayrıştırıcı, izin verilmeyen bir jetonla karşılaşırsa aşağıdaki koşullardan biri veya daha fazlası geçerli olduğu sürece olası söz dizimi hatasını düzeltmek için söz konusu jetondan önce noktalı virgül eklemeye çalışır:

  • Bu jeton, önceki jetondan satır sonu işaretiyle ayrılır.
  • Bu jeton }.