← ECMAScript 2027 · İçindekiler
ECMA-262 · 18inci Baskı
10

Sıradan ve Egzotik Nesnelerin Davranışları

10.1 Sıradan Nesne İç Yöntemleri ve İç Yuvalar

Tüm sıradan nesneler, [[Prototype]] adlı bir iç yuvaya sahiptir. Bu iç yuvanın değeri ya null ya da bir nesnedir ve kalıtımı gerçekleştirmek için kullanılır. Bir sıradan nesne obj üzerinde propertyKey adlı bir özelliğin eksik olduğunu ancak onun [[Prototype]] nesnesinde bulunduğunu varsayın. Eğer propertyKey, [[Prototype]] nesnesi üzerindeki bir veri özelliğine atıfta bulunuyorsa, obj bunu get erişimi için kalıtır ve propertyKey sanki obj'nin bir özelliğiymiş gibi davranır. Eğer propertyKey, [[Prototype]] nesnesi üzerindeki yazılabilir bir veri özelliğine atıfta bulunuyorsa, obj üzerinde propertyKey için set erişimi, obj üzerinde propertyKey adında yeni bir veri özelliği oluşturur. Eğer propertyKey, [[Prototype]] nesnesi üzerindeki yazılamaz bir veri özelliğine atıfta bulunuyorsa, obj üzerinde propertyKey için set erişimi başarısız olur. Eğer propertyKey, [[Prototype]] nesnesi üzerindeki bir erişimci özelliğine atıfta bulunuyorsa, erişimci hem get erişimi hem de set erişimi için obj tarafından kalıtılır.

Her sıradan nesne, 6.1.7.3'te belirtilen genişletilebilirlikle ilgili iç yöntem değişmezlerini sağlamak için kullanılan Boolean değerli bir [[Extensible]] iç yuvasına sahiptir. Yani, bir nesnenin [[Extensible]] iç yuvasının değeri false olarak ayarlandıktan sonra, artık nesneye özellik eklemek, nesnenin [[Prototype]] iç yuvasının değerini değiştirmek veya daha sonra [[Extensible]] değerini true olarak değiştirmek mümkün değildir.

Aşağıdaki algoritma açıklamalarında, obj'nin bir sıradan nesne olduğunu, propertyKey'in bir özellik anahtarı değeri olduğunu, value'nun herhangi bir ECMAScript dil değeri olduğunu ve propertyDesc'in bir Property Descriptor kaydı olduğunu varsayın.

Her sıradan nesne iç yöntemi, benzer adlı bir soyut işleme devreder. Eğer böyle bir soyut işlem başka bir iç yönteme bağlıysa, o zaman benzer adlı soyut işlem doğrudan çağrılmak yerine obj üzerinde iç yöntem çağrılır. Bu anlambilim, sıradan nesne iç yöntemleri egzotik nesnelere uygulandığında, onların geçersiz kılınmış iç yöntemlerinin çağrılmasını sağlar.

10.1.1 [[GetPrototypeOf]] ( )

Bir sıradan nesne obj'nin [[GetPrototypeOf]] iç yöntemi hiçbir argüman almaz ve ya bir Object ya da null içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. OrdinaryGetPrototypeOf(obj) döndür.

10.1.1.1 OrdinaryGetPrototypeOf ( obj )

Soyut işlem OrdinaryGetPrototypeOf, obj (bir Object) argümanını alır ve bir Object veya null döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj.[[Prototype]] döndür.

10.1.2 [[SetPrototypeOf]] ( proto )

Bir sıradan nesne obj'nin [[SetPrototypeOf]] iç yöntemi, proto (bir Object veya null) argümanını alır ve bir Boolean içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. OrdinarySetPrototypeOf(obj, proto) döndür.

10.1.2.1 OrdinarySetPrototypeOf ( obj, proto )

Soyut işlem OrdinarySetPrototypeOf, obj (bir Object) ve proto (bir Object veya null) argümanlarını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. current = obj.[[Prototype]] olsun.

  2. Eğer SameValue(proto, current) true ise, true döndür.

  3. extensible = obj.[[Extensible]] olsun.

  4. Eğer extensible false ise, false döndür.

  5. cursor = proto olsun.

  6. done = false olsun.

  7. done false olduğu sürece tekrar et,

    1. Eğer cursor null ise, o zaman

      1. donetrue olarak ayarla.
    2. Değilse, eğer SameValue(cursor, obj) true ise, o zaman

      1. false döndür.
    3. Değilse,

      1. Eğer cursor.[[GetPrototypeOf]], 10.1.1'de tanımlanan sıradan nesne iç yöntemi değilse, donetrue olarak ayarla.

      2. Değilse, cursor = cursor.[[Prototype]] olarak ayarla.

  8. obj.[[Prototype]]proto olarak ayarla.

  9. true döndür.

10.1.3 [[IsExtensible]] ( )

Bir sıradan nesne obj'nin [[IsExtensible]] iç yöntemi hiçbir argüman almaz ve bir Boolean içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. OrdinaryIsExtensible(obj) döndür.

10.1.3.1 OrdinaryIsExtensible ( obj )

Soyut işlem OrdinaryIsExtensible, obj (bir Object) argümanını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj.[[Extensible]] döndür.

10.1.4 [[PreventExtensions]] ( )

Bir sıradan nesne obj'nin [[PreventExtensions]] iç yöntemi hiçbir argüman almaz ve true içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. OrdinaryPreventExtensions(obj) döndür.

10.1.4.1 OrdinaryPreventExtensions ( obj )

Soyut işlem OrdinaryPreventExtensions, obj (bir Object) argümanını alır ve true döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj.[[Extensible]]false olarak ayarla.

  2. true döndür.

10.1.5 [[GetOwnProperty]] ( propertyKey )

Bir sıradan nesne obj'nin [[GetOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Property Descriptor ya da undefined içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. OrdinaryGetOwnProperty(obj, propertyKey) döndür.

10.1.5.1 OrdinaryGetOwnProperty ( obj, propertyKey )

Soyut işlem OrdinaryGetOwnProperty, obj (bir Object) ve propertyKey (bir özellik anahtarı) argümanlarını alır ve bir Property Descriptor veya undefined döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer obj, propertyKey anahtarına sahip bir kendi özelliğine sahip değilse, undefined döndür.

  2. propertyDesc, hiçbir alanı olmayan yeni oluşturulmuş bir Property Descriptor olsun.

  3. ownProperty, obj'nin anahtarı propertyKey olan kendi özelliği olsun.

  4. Eğer ownProperty bir veri özelliği ise, o zaman

    1. propertyDesc.[[Value]]'ı, ownProperty'nin [[Value]] niteliğinin değerine ayarla.

    2. propertyDesc.[[Writable]]'ı, ownProperty'nin [[Writable]] niteliğinin değerine ayarla.

  5. Değilse,

    1. Assert: ownProperty bir erişimci özelliğidir.

    2. propertyDesc.[[Get]]'i, ownProperty'nin [[Get]] niteliğinin değerine ayarla.

    3. propertyDesc.[[Set]]'i, ownProperty'nin [[Set]] niteliğinin değerine ayarla.

  6. propertyDesc.[[Enumerable]]'i, ownProperty'nin [[Enumerable]] niteliğinin değerine ayarla.

  7. propertyDesc.[[Configurable]]'ı, ownProperty'nin [[Configurable]] niteliğinin değerine ayarla.

  8. propertyDesc döndür.

10.1.6 [[DefineOwnProperty]] ( propertyKey, propertyDesc )

Bir sıradan nesne obj'nin [[DefineOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) ve propertyDesc (bir Property Descriptor) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? OrdinaryDefineOwnProperty(obj, propertyKey, propertyDesc) döndür.

10.1.6.1 OrdinaryDefineOwnProperty ( obj, propertyKey, propertyDesc )

Soyut işlem OrdinaryDefineOwnProperty, obj (bir Object), propertyKey (bir özellik anahtarı) ve propertyDesc (bir Property Descriptor) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. current = ? obj.[[GetOwnProperty]](propertyKey) olsun.

  2. extensible = ? IsExtensible(obj) olsun.

  3. ValidateAndApplyPropertyDescriptor(obj, propertyKey, extensible, propertyDesc, current) döndür.

10.1.6.2 IsCompatiblePropertyDescriptor ( extensible, propertyDesc, current )

Soyut işlem IsCompatiblePropertyDescriptor, extensible (bir Boolean), propertyDesc (bir Property Descriptor) ve current (bir Property Descriptor veya undefined) argümanlarını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ValidateAndApplyPropertyDescriptor(undefined, "", extensible, propertyDesc, current) döndür.

10.1.6.3 ValidateAndApplyPropertyDescriptor ( obj, propertyKey, extensible, propertyDesc, current )

Soyut işlem ValidateAndApplyPropertyDescriptor, obj (bir Object veya undefined), propertyKey (bir özellik anahtarı), extensible (bir Boolean), propertyDesc (bir Property Descriptor) ve current (bir Property Descriptor veya undefined) argümanlarını alır ve bir Boolean döndürür. propertyDesc, belirtilen extensibility'ye ve mevcut current özelliğine sahip bir nesnenin özelliği olarak değişmezleri ihlal etmeden uygulanabiliyorsa true döndürür. Böyle bir uygulama mümkün olduğunda ve obj undefined değilse, propertyKey adlı özellik için (gerekirse oluşturularak) gerçekleştirilir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: propertyKey bir özellik anahtarıdır.

  2. Eğer current undefined ise, o zaman

    1. Eğer extensible false ise, false döndür.

    2. Eğer obj undefined ise, true döndür.

    3. Eğer IsAccessorDescriptor(propertyDesc) true ise, o zaman

      1. obj nesnesinin propertyKey adında, propertyDesc'te o alan varsa [[Get]], [[Set]], [[Enumerable]] ve [[Configurable]] nitelikleri propertyDesc'teki ilgili alanın değerine, aksi takdirde niteliğin varsayılan değerine ayarlanmış bir kendi erişimci özelliği oluştur.
    4. Değilse,

      1. obj nesnesinin propertyKey adında, propertyDesc'te o alan varsa [[Value]], [[Writable]], [[Enumerable]] ve [[Configurable]] nitelikleri propertyDesc'teki ilgili alanın değerine, aksi takdirde niteliğin varsayılan değerine ayarlanmış bir kendi veri özelliği oluştur.
    5. true döndür.

  3. Assert: current, tam olarak doldurulmuş bir Property Descriptor'dır.

  4. Eğer propertyDesc hiçbir alana sahip değilse, true döndür.

  5. Eğer current.[[Configurable]] false ise, o zaman

    1. Eğer propertyDesc bir [[Configurable]] alanına sahipse ve propertyDesc.[[Configurable]] true ise, false döndür.

    2. Eğer propertyDesc bir [[Enumerable]] alanına sahipse ve propertyDesc.[[Enumerable]], current.[[Enumerable]] değilse, false döndür.

    3. Eğer IsGenericDescriptor(propertyDesc) false ise ve IsAccessorDescriptor(propertyDesc), IsAccessorDescriptor(current) değilse, false döndür.

    4. Eğer IsAccessorDescriptor(current) true ise, o zaman

      1. Eğer propertyDesc bir [[Get]] alanına sahipse ve SameValue(propertyDesc.[[Get]], current.[[Get]]) false ise, false döndür.

      2. Eğer propertyDesc bir [[Set]] alanına sahipse ve SameValue(propertyDesc.[[Set]], current.[[Set]]) false ise, false döndür.

    5. Değilse, eğer current.[[Writable]] false ise, o zaman

      1. Eğer propertyDesc bir [[Writable]] alanına sahipse ve propertyDesc.[[Writable]] true ise, false döndür.

      2. NOTE: SameValue, başka yollarla ayırt edilebilen NaN değerleri için true döndürür. Burada dönmek, obj'nin mevcut herhangi bir özelliğinin değiştirilmeden kalmasını sağlar.

      3. Eğer propertyDesc bir [[Value]] alanına sahipse, SameValue(propertyDesc.[[Value]], current.[[Value]]) döndür.

  6. Eğer obj undefined değilse, o zaman

    1. Eğer IsDataDescriptor(current) true ve IsAccessorDescriptor(propertyDesc) true ise, o zaman

      1. Eğer propertyDesc bir [[Configurable]] alanına sahipse, configurable = propertyDesc.[[Configurable]] olsun; değilse configurable = current.[[Configurable]] olsun.

      2. Eğer propertyDesc bir [[Enumerable]] alanına sahipse, enumerable = propertyDesc.[[Enumerable]] olsun; değilse enumerable = current.[[Enumerable]] olsun.

      3. obj nesnesinin propertyKey adlı özelliğini, [[Configurable]] ve [[Enumerable]] nitelikleri sırasıyla configurable ve enumerable olarak ayarlanmış ve [[Get]] ve [[Set]] nitelikleri, propertyDesc'te o alan varsa propertyDesc'teki ilgili alanın değerine, aksi takdirde niteliğin varsayılan değerine ayarlanmış bir erişimci özelliği ile değiştir.

    2. Değilse, eğer IsAccessorDescriptor(current) true ve IsDataDescriptor(propertyDesc) true ise, o zaman

      1. Eğer propertyDesc bir [[Configurable]] alanına sahipse, configurable = propertyDesc.[[Configurable]] olsun; değilse configurable = current.[[Configurable]] olsun.

      2. Eğer propertyDesc bir [[Enumerable]] alanına sahipse, enumerable = propertyDesc.[[Enumerable]] olsun; değilse enumerable = current.[[Enumerable]] olsun.

      3. obj nesnesinin propertyKey adlı özelliğini, [[Configurable]] ve [[Enumerable]] nitelikleri sırasıyla configurable ve enumerable olarak ayarlanmış ve [[Value]] ve [[Writable]] nitelikleri, propertyDesc'te o alan varsa propertyDesc'teki ilgili alanın değerine, aksi takdirde niteliğin varsayılan değerine ayarlanmış bir veri özelliği ile değiştir.

    3. Değilse,

      1. propertyDesc'in her fieldName alan adı için, obj nesnesinin propertyKey adlı özelliğinin fieldName adlı niteliğini, propertyDesc'in fieldName alanının değerine ayarla.
  7. true döndür.

10.1.7 [[HasProperty]] ( propertyKey )

Bir sıradan nesne obj'nin [[HasProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? OrdinaryHasProperty(obj, propertyKey) döndür.

10.1.7.1 OrdinaryHasProperty ( obj, propertyKey )

Soyut işlem OrdinaryHasProperty, obj (bir Object) ve propertyKey (bir özellik anahtarı) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. hasOwn = ? obj.[[GetOwnProperty]](propertyKey) olsun.

  2. Eğer hasOwn undefined değilse, true döndür.

  3. parent = ? obj.[[GetPrototypeOf]]() olsun.

  4. Eğer parent null değilse, o zaman

    1. ? parent.[[HasProperty]](propertyKey) döndür.
  5. false döndür.

10.1.8 [[Get]] ( propertyKey, receiver )

Bir sıradan nesne obj'nin [[Get]] iç yöntemi, propertyKey (bir özellik anahtarı) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? OrdinaryGet(obj, propertyKey, receiver) döndür.

10.1.8.1 OrdinaryGet ( obj, propertyKey, receiver )

Soyut işlem OrdinaryGet, obj (bir Object), propertyKey (bir özellik anahtarı) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. propertyDesc = ? obj.[[GetOwnProperty]](propertyKey) olsun.

  2. Eğer propertyDesc undefined ise, o zaman

    1. parent = ? obj.[[GetPrototypeOf]]() olsun.

    2. Eğer parent null ise, undefined döndür.

    3. ? parent.[[Get]](propertyKey, receiver) döndür.

  3. Eğer IsDataDescriptor(propertyDesc) true ise, propertyDesc.[[Value]] döndür.

  4. Assert: IsAccessorDescriptor(propertyDesc) true'dur.

  5. getter = propertyDesc.[[Get]] olsun.

  6. Eğer getter undefined ise, undefined döndür.

  7. ? Call(getter, receiver) döndür.

10.1.9 [[Set]] ( propertyKey, value, receiver )

Bir sıradan nesne obj'nin [[Set]] iç yöntemi, propertyKey (bir özellik anahtarı), value (bir ECMAScript dil değeri) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? OrdinarySet(obj, propertyKey, value, receiver) döndür.

10.1.9.1 OrdinarySet ( obj, propertyKey, value, receiver )

Soyut işlem OrdinarySet, obj (bir Object), propertyKey (bir özellik anahtarı), value (bir ECMAScript dil değeri) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ownDesc = ? obj.[[GetOwnProperty]](propertyKey) olsun.

  2. ? OrdinarySetWithOwnDescriptor(obj, propertyKey, value, receiver, ownDesc) döndür.

10.1.9.2 OrdinarySetWithOwnDescriptor ( obj, propertyKey, value, receiver, ownDesc )

Soyut işlem OrdinarySetWithOwnDescriptor, obj (bir Object), propertyKey (bir özellik anahtarı), value (bir ECMAScript dil değeri), receiver (bir ECMAScript dil değeri) ve ownDesc (bir Property Descriptor veya undefined) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer ownDesc undefined ise, o zaman

    1. parent = ? obj.[[GetPrototypeOf]]() olsun.

    2. Eğer parent null değilse, ? parent.[[Set]](propertyKey, value, receiver) döndür.

    3. ownDesc = PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } olarak ayarla.

  2. Eğer IsDataDescriptor(ownDesc) true ise, o zaman

    1. Eğer ownDesc.[[Writable]] false ise, false döndür.

    2. Eğer receiver bir Object değilse, false döndür.

    3. existingDesc = ? receiver.[[GetOwnProperty]](propertyKey) olsun.

    4. Eğer existingDesc undefined ise, o zaman

      1. Assert: receiver şu anda propertyKey özelliğine sahip değildir.

      2. ? CreateDataProperty(receiver, propertyKey, value) döndür.

    5. Eğer IsAccessorDescriptor(existingDesc) true ise, false döndür.

    6. Eğer existingDesc.[[Writable]] false ise, false döndür.

    7. valueDesc = PropertyDescriptor { [[Value]]: value } olsun.

    8. ? receiver.[[DefineOwnProperty]](propertyKey, valueDesc) döndür.

  3. Assert: IsAccessorDescriptor(ownDesc) true'dur.

  4. setter = ownDesc.[[Set]] olsun.

  5. Eğer setter undefined ise, false döndür.

  6. ? Call(setter, receiver, « value ») işlemini gerçekleştir.

  7. true döndür.

10.1.10 [[Delete]] ( propertyKey )

Bir sıradan nesne obj'nin [[Delete]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? OrdinaryDelete(obj, propertyKey) döndür.

10.1.10.1 OrdinaryDelete ( obj, propertyKey )

Soyut işlem OrdinaryDelete, obj (bir Object) ve propertyKey (bir özellik anahtarı) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. propertyDesc = ? obj.[[GetOwnProperty]](propertyKey) olsun.

  2. Eğer propertyDesc undefined ise, true döndür.

  3. Eğer propertyDesc.[[Configurable]] true ise, o zaman

    1. obj'den propertyKey adlı kendi özelliğini kaldır.

    2. true döndür.

  4. false döndür.

10.1.11 [[OwnPropertyKeys]] ( )

Bir sıradan nesne obj'nin [[OwnPropertyKeys]] iç yöntemi hiçbir argüman almaz ve özellik anahtarlarından oluşan bir Liste içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. OrdinaryOwnPropertyKeys(obj) döndür.

10.1.11.1 OrdinaryOwnPropertyKeys ( obj )

Soyut işlem OrdinaryOwnPropertyKeys, obj (bir Object) argümanını alır ve özellik anahtarlarından oluşan bir Liste döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. keys, yeni bir boş Liste olsun.

  2. obj'nin, propertyKey bir dizi indisi olan her kendi özellik anahtarı propertyKey için, artan sayısal indis sırasında,

    1. propertyKey'i keys'e ekle.
  3. obj'nin, propertyKey bir String olan ve bir dizi indisi olmayan her kendi özellik anahtarı propertyKey için, özellik oluşturmanın artan kronolojik sırasında,

    1. propertyKey'i keys'e ekle.
  4. obj'nin, propertyKey bir Symbol olan her kendi özellik anahtarı propertyKey için, özellik oluşturmanın artan kronolojik sırasında,

    1. propertyKey'i keys'e ekle.
  5. keys döndür.

10.1.12 OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] )

Soyut işlem OrdinaryObjectCreate, proto (bir Object veya null) argümanını ve isteğe bağlı additionalInternalSlotsList (iç yuva adlarından oluşan bir Liste) argümanını alır ve bir Object döndürür. Yeni sıradan nesnelerin çalışma zamanında oluşturulmasını belirtmek için kullanılır. additionalInternalSlotsList, [[Prototype]] ve [[Extensible]] ötesinde, nesnenin parçası olarak tanımlanması gereken ek iç yuvaların adlarını içerir. additionalInternalSlotsList sağlanmazsa, yeni bir boş Liste kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. internalSlotsList = « [[Prototype]], [[Extensible]] » olsun.

  2. Eğer additionalInternalSlotsList mevcutsa, internalSlotsList'i, internalSlotsList ile additionalInternalSlotsList'in liste birleştirmesi olarak ayarla.

  3. obj = MakeBasicObject(internalSlotsList) olsun.

  4. obj.[[Prototype]]proto olarak ayarla.

  5. obj döndür.

10.1.13 OrdinaryCreateFromConstructor ( ctor, intrinsicDefaultProto [ , internalSlotsList ] )

Soyut işlem OrdinaryCreateFromConstructor, ctor (bir işlev nesnesi) ve intrinsicDefaultProto (bir String) argümanlarını ve isteğe bağlı internalSlotsList (iç yuva adlarından oluşan bir Liste) argümanını alır ve ya bir Object içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. [[Prototype]] değeri, varsa bir oluşturucunun "prototype" özelliğinden alınan bir sıradan nesne oluşturur. Aksi takdirde, [[Prototype]] için intrinsicDefaultProto tarafından adlandırılan içkin kullanılır. internalSlotsList, nesnenin parçası olarak tanımlanması gereken ek iç yuvaların adlarını içerir. internalSlotsList sağlanmazsa, yeni bir boş Liste kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: intrinsicDefaultProto, bu belirtimin bir içkin nesne adıdır. Karşılık gelen nesne, bir nesnenin [[Prototype]] değeri olarak kullanılmak üzere tasarlanmış bir içkin olmalıdır.

  2. proto = ? GetPrototypeFromConstructor(ctor, intrinsicDefaultProto) olsun.

  3. Eğer internalSlotsList mevcutsa, slots = internalSlotsList olsun.

  4. Değilse, slots yeni bir boş Liste olsun.

  5. OrdinaryObjectCreate(proto, slots) döndür.

10.1.14 GetPrototypeFromConstructor ( ctor, intrinsicDefaultProto )

Soyut işlem GetPrototypeFromConstructor, ctor (bir işlev nesnesi) ve intrinsicDefaultProto (bir String) argümanlarını alır ve ya bir Object içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Belirli bir oluşturucuya karşılık gelen bir nesne oluşturmak için kullanılması gereken [[Prototype]] değerini belirler. Değer, varsa oluşturucunun "prototype" özelliğinden alınır. Aksi takdirde, [[Prototype]] için intrinsicDefaultProto tarafından adlandırılan içkin kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: intrinsicDefaultProto, bu belirtimin bir içkin nesne adıdır. Karşılık gelen nesne, bir nesnenin [[Prototype]] değeri olarak kullanılmak üzere tasarlanmış bir içkin olmalıdır.

  2. proto = ? Get(ctor, "prototype") olsun.

  3. Eğer proto bir Object değilse, o zaman

    1. realm = ? GetFunctionRealm(ctor) olsun.

    2. proto = realm'in intrinsicDefaultProto adlı içkin nesnesi olarak ayarla.

  4. proto döndür.

10.1.15 RequireInternalSlot ( obj, internalSlot )

Soyut işlem RequireInternalSlot, obj (bir ECMAScript dil değeri) ve internalSlot (bir iç yuva adı) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. obj bir Object değilse veya verilen iç yuvaya sahip değilse bir kuraldışı durum fırlatır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer obj bir Object değilse, bir TypeError kuraldışı durumu fırlat.

  2. Eğer obj, internalSlot iç yuvasına sahip değilse, bir TypeError kuraldışı durumu fırlat.

  3. unused döndür.

10.2 ECMAScript İşlev Nesneleri

ECMAScript işlev nesneleri, bir sözcüksel ortam üzerine kapatılmış parametreli ECMAScript kodunu kapsüller ve bu kodun dinamik değerlendirmesini destekler. Bir ECMAScript işlev nesnesi, bir sıradan nesnedir ve diğer sıradan nesnelerle aynı iç yuvalara ve aynı iç yöntemlere sahiptir. Bir ECMAScript işlev nesnesinin kodu, ya katı kip kodu (11.2.2) ya da katı olmayan kod olabilir. Kodu katı kip kodu olan bir ECMAScript işlev nesnesine katı işlev denir. Kodu katı kip kodu olmayana ise katı olmayan işlev denir.

ECMAScript işlev nesneleri, [[Extensible]] ve [[Prototype]]'a ek olarak, Tablo 25'te listelenen iç yuvalara da sahiptir.

Tablo 25: ECMAScript İşlev Nesnelerinin İç Yuvaları

İç Yuva Tür Açıklama
[[Environment]] bir Ortam Kaydı İşlevin üzerine kapatıldığı Ortam Kaydı. İşlevin kodu değerlendirilirken dış ortam olarak kullanılır.
[[PrivateEnvironment]] bir Özel Ortam Kaydı veya null İşlevin üzerine kapatıldığı Private Name'ler için Özel Ortam Kaydı. Bu işlev sözdizimsel olarak bir sınıf içinde yer almıyorsa null. İşlevin kodu değerlendirilirken iç sınıflar için dış PrivateEnvironment olarak kullanılır.
[[FormalParameters]] bir Parse Node İşlevin biçimsel parametre listesini tanımlayan kaynak metnin kök ayrıştırma düğümü.
[[ECMAScriptCode]] bir Parse Node İşlevin gövdesini tanımlayan kaynak metnin kök ayrıştırma düğümü.
[[ConstructorKind]] base veya derived İşlevin türetilmiş bir sınıf oluşturucusu olup olmadığı.
[[Realm]] bir Realm Record İşlevin oluşturulduğu ve işlev değerlendirilirken erişilen herhangi bir içkin nesneyi sağlayan gerçeklik alanı.
[[ScriptOrModule]] bir Script Record veya bir Module Record İşlevin oluşturulduğu betik veya modül.
[[ThisMode]] lexical, strict veya global İşlevin biçimsel parametreleri ve kod gövdesi içinde this başvurularının nasıl yorumlanacağını tanımlar. lexical, this'in sözcüksel olarak çevreleyen bir işlevin this değerine atıfta bulunduğu anlamına gelir. strict, this değerinin tam olarak işlevin bir çağrısı tarafından sağlandığı gibi kullanıldığı anlamına gelir. global, undefined veya null olan bir this değerinin küresel nesneye bir başvuru olarak yorumlandığı ve diğer herhangi bir this değerinin önce ToObject'e geçirildiği anlamına gelir.
[[Strict]] bir Boolean Bu bir katı işlev ise true, katı olmayan işlev ise false.
[[HomeObject]] bir Object veya undefined Eğer işlev super kullanıyorsa, bu, super özellik aramalarının başladığı nesneyi sağlayan [[GetPrototypeOf]]'a sahip nesnedir.
[[SourceText]] bir Unicode kod noktaları dizisi İşlevi tanımlayan kaynak metin.
[[Fields]] ClassFieldDefinition Record'lardan oluşan bir Liste Eğer işlev bir sınıfsa, bu, sınıfın statik olmayan alanlarını ve karşılık gelen ilklendiricilerini temsil eden Record'ların bir listesidir.
[[PrivateMethods]] PrivateElement'lerden oluşan bir Liste Eğer işlev bir sınıfsa, bu, sınıfın statik olmayan özel yöntemlerini ve erişimcilerini temsil eden bir listedir.
[[ClassFieldInitializerName]] bir String, bir Symbol, bir Private Name veya empty Eğer işlev bir sınıf alanının ilklendiricisi olarak oluşturulmuşsa, alanın NamedEvaluation işlemi için kullanılacak ad; aksi takdirde empty.
[[IsClassConstructor]] bir Boolean İşlevin bir sınıf oluşturucusu olup olmadığını belirtir. (Eğer true ise, işlevin [[Call]] yöntemini çağırmak hemen bir TypeError kuraldışı durumu fırlatır.)

Tüm ECMAScript işlev nesneleri, burada tanımlanan [[Call]] iç yöntemine sahiptir. Aynı zamanda oluşturucu olan ECMAScript işlevleri ayrıca [[Construct]] iç yöntemine de sahiptir.

10.2.1 [[Call]] ( thisArg, argList )

Bir ECMAScript işlev nesnesi func'ın [[Call]] iç yöntemi, thisArg (bir ECMAScript dil değeri) ve argList (ECMAScript dil değerlerinden oluşan bir Liste) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. callerContext = çalışan yürütme bağlamı olsun.

  2. calleeContext = PrepareForOrdinaryCall(func, undefined) olsun.

  3. Assert: calleeContext artık çalışan yürütme bağlamıdır.

  4. Eğer func.[[IsClassConstructor]] true ise, o zaman

    1. error, yeni oluşturulmuş bir TypeError nesnesi olsun.

    2. NOTE: error, func'ın ilişkili Realm Record'u ile calleeContext içinde oluşturulur.

    3. calleeContext'i yürütme bağlamı yığınından kaldır ve callerContext'i çalışan yürütme bağlamı olarak geri yükle.

    4. error fırlat.

  5. OrdinaryCallBindThis(func, calleeContext, thisArg) işlemini gerçekleştir.

  6. result = Completion(OrdinaryCallEvaluateBody(func, argList)) olsun.

  7. calleeContext'i yürütme bağlamı yığınından kaldır ve callerContext'i çalışan yürütme bağlamı olarak geri yükle.

  8. Eğer result bir return tamamlanması ise, result.[[Value]] döndür.

  9. Assert: result bir throw tamamlanmasıdır.

  10. ? result döndür.

10.2.1.1 PrepareForOrdinaryCall ( func, newTarget )

Soyut işlem PrepareForOrdinaryCall, func (bir ECMAScript işlev nesnesi) ve newTarget (bir Object veya undefined) argümanlarını alır ve bir yürütme bağlamı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. callerContext = çalışan yürütme bağlamı olsun.

  2. calleeContext, yeni bir ECMAScript kodu yürütme bağlamı olsun.

  3. calleeContext'in Function bileşenini func olarak ayarla.

  4. calleeRealm = func.[[Realm]] olsun.

  5. calleeContext'in Realm bileşenini calleeRealm olarak ayarla.

  6. calleeContext'in ScriptOrModule bileşenini func.[[ScriptOrModule]] olarak ayarla.

  7. localEnv = NewFunctionEnvironment(func, newTarget) olsun.

  8. calleeContext'in LexicalEnvironment bileşenini localEnv olarak ayarla.

  9. calleeContext'in VariableEnvironment bileşenini localEnv olarak ayarla.

  10. calleeContext'in PrivateEnvironment bileşenini func.[[PrivateEnvironment]] olarak ayarla.

  11. Eğer callerContext zaten askıya alınmamışsa, callerContext'i askıya al.

  12. calleeContext'i yürütme bağlamı yığınına it; calleeContext artık çalışan yürütme bağlamıdır.

  13. NOTE: Bu noktadan sonra üretilen herhangi bir kuraldışı durum nesnesi calleeRealm ile ilişkilendirilir.

  14. calleeContext döndür.

10.2.1.2 OrdinaryCallBindThis ( func, calleeContext, thisArg )

Soyut işlem OrdinaryCallBindThis, func (bir ECMAScript işlev nesnesi), calleeContext (bir yürütme bağlamı) ve thisArg (bir ECMAScript dil değeri) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. thisMode = func.[[ThisMode]] olsun.

  2. Eğer thisMode lexical ise, unused döndür.

  3. calleeRealm = func.[[Realm]] olsun.

  4. localEnv = calleeContext'in LexicalEnvironment bileşeni olsun.

  5. Eğer thisMode strict ise, o zaman

    1. thisValue = thisArg olsun.
  6. Değilse,

    1. Eğer thisArg undefined veya null ise, o zaman

      1. globalEnv = calleeRealm.[[GlobalEnv]] olsun.

      2. Assert: globalEnv bir Küresel Ortam Kaydıdır.

      3. thisValue = globalEnv.[[GlobalThisValue]] olsun.

    2. Değilse,

      1. thisValue = ! ToObject(thisArg) olsun.

      2. NOTE: ToObject, calleeRealm kullanarak sarmalayıcı nesneler üretir.

  7. Assert: localEnv bir İşlev Ortam Kaydıdır.

  8. Assert: Bir sonraki adım asla bir ani tamamlanma döndürmez, çünkü localEnv.[[ThisBindingStatus]] initialized değildir.

  9. ! BindThisValue(localEnv, thisValue) işlemini gerçekleştir.

  10. unused döndür.

10.2.1.3 Çalışma Zamanı Anlambilimi: EvaluateBody

Sözdizimi yönelimli işlem EvaluateBody, func (bir ECMAScript işlev nesnesi) ve argList (ECMAScript dil değerlerinden oluşan bir Liste) argümanlarını alır ve bir return tamamlanması veya bir throw tamamlanması döndürür. Aşağıdaki üretimler üzerinde parça parça tanımlanmıştır:

FunctionBody FunctionBody : FunctionStatementList

  1. ? FunctionBody'nin func ve argList argümanlarıyla EvaluateFunctionBody değerini döndür.

ConciseBody ConciseBody : ExpressionBody

  1. ? ConciseBody'nin func ve argList argümanlarıyla EvaluateConciseBody değerini döndür.

GeneratorBody GeneratorBody : FunctionBody

  1. ? GeneratorBody'nin func ve argList argümanlarıyla EvaluateGeneratorBody değerini döndür.

AsyncGeneratorBody AsyncGeneratorBody : FunctionBody

  1. ? AsyncGeneratorBody'nin func ve argList argümanlarıyla EvaluateAsyncGeneratorBody değerini döndür.

AsyncFunctionBody AsyncFunctionBody : FunctionBody

  1. ? AsyncFunctionBody'nin func ve argList argümanlarıyla EvaluateAsyncFunctionBody değerini döndür.

AsyncConciseBody AsyncConciseBody : ExpressionBody

  1. ? AsyncConciseBody'nin func ve argList argümanlarıyla EvaluateAsyncConciseBody değerini döndür.

Initializer Initializer : = AssignmentExpression

  1. Assert: argList boştur.

  2. Assert: func.[[ClassFieldInitializerName]] empty değildir.

  3. Eğer IsAnonymousFunctionDefinition(AssignmentExpression) true ise, o zaman

    1. value = ? Initializer'ın func.[[ClassFieldInitializerName]] argümanıyla NamedEvaluation değeri olsun.
  4. Değilse,

    1. rhs = ? AssignmentExpression'in Evaluation değeri olsun.

    2. value = ? GetValue(rhs) olsun.

  5. ReturnCompletion(value) döndür.

ClassStaticBlockBody ClassStaticBlockBody : ClassStaticBlockStatementList

  1. Assert: argList boştur.

  2. ? ClassStaticBlockBody'nin func argümanıyla EvaluateClassStaticBlockBody değerini döndür.

10.2.1.4 OrdinaryCallEvaluateBody ( func, argList )

Soyut işlem OrdinaryCallEvaluateBody, func (bir ECMAScript işlev nesnesi) ve argList (ECMAScript dil değerlerinden oluşan bir Liste) argümanlarını alır ve bir return tamamlanması veya bir throw tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? func.[[ECMAScriptCode]]'un func ve argList argümanlarıyla EvaluateBody değerini döndür.

10.2.2 [[Construct]] ( argList, newTarget )

Bir ECMAScript işlev nesnesi func'ın [[Construct]] iç yöntemi, argList (ECMAScript dil değerlerinden oluşan bir Liste) ve newTarget (bir oluşturucu) argümanlarını alır ve ya bir Object içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. callerContext = çalışan yürütme bağlamı olsun.

  2. kind = func.[[ConstructorKind]] olsun.

  3. Eğer kind base ise, o zaman

    1. thisArg = ? OrdinaryCreateFromConstructor(newTarget, "%Object.prototype%") olsun.
  4. calleeContext = PrepareForOrdinaryCall(func, newTarget) olsun.

  5. Assert: calleeContext artık çalışan yürütme bağlamıdır.

  6. Eğer kind base ise, o zaman

    1. OrdinaryCallBindThis(func, calleeContext, thisArg) işlemini gerçekleştir.

    2. initializeResult = Completion(InitializeInstanceElements(thisArg, func)) olsun.

    3. Eğer initializeResult bir ani tamamlanma ise, o zaman

      1. calleeContext'i yürütme bağlamı yığınından kaldır ve callerContext'i çalışan yürütme bağlamı olarak geri yükle.

      2. ? initializeResult döndür.

  7. ctorEnv = calleeContext'in LexicalEnvironment bileşeni olsun.

  8. result = Completion(OrdinaryCallEvaluateBody(func, argList)) olsun.

  9. calleeContext'i yürütme bağlamı yığınından kaldır ve callerContext'i çalışan yürütme bağlamı olarak geri yükle.

  10. Eğer result bir throw tamamlanması ise, o zaman

    1. ? result döndür.
  11. Assert: result bir return tamamlanmasıdır.

  12. Eğer result.[[Value]] bir Object ise, result.[[Value]] döndür.

  13. Eğer kind base ise, thisArg döndür.

  14. Eğer result.[[Value]] undefined değilse, bir TypeError kuraldışı durumu fırlat.

  15. thisBinding = ? ctorEnv.GetThisBinding() olsun.

  16. Assert: thisBinding bir Object'tir.

  17. thisBinding döndür.

10.2.3 OrdinaryFunctionCreate ( proto, sourceText, paramList, body, thisMode, envRecord, privateEnv )

Soyut işlem OrdinaryFunctionCreate, proto (bir Object), sourceText (bir Unicode kod noktaları dizisi), paramList (bir Parse Node), body (bir Parse Node), thisMode (lexical-this veya non-lexical-this), envRecord (bir Ortam Kaydı) ve privateEnv (bir Özel Ortam Kaydı veya null) argümanlarını alır ve bir ECMAScript işlev nesnesi döndürür. Varsayılan bir [[Call]] iç yöntemine sahip ve [[Construct]] iç yöntemi olmayan (ancak daha sonra MakeConstructor gibi bir işlem tarafından eklenebilir) yeni bir işlevin çalışma zamanında oluşturulmasını belirtmek için kullanılır. sourceText, oluşturulacak işlevin sözdizimsel tanımının kaynak metnidir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. internalSlotsList, Tablo 25'te listelenen iç yuvalar olsun.

  2. func = OrdinaryObjectCreate(proto, internalSlotsList) olsun.

  3. func.[[Call]]10.2.1'de belirtilen tanıma ayarla.

  4. func.[[SourceText]]'i sourceText olarak ayarla.

  5. func.[[FormalParameters]]paramList olarak ayarla.

  6. func.[[ECMAScriptCode]]'u body olarak ayarla.

  7. strict = IsStrict(body) olsun.

  8. func.[[Strict]]'i strict olarak ayarla.

  9. Eğer thisMode lexical-this ise, func.[[ThisMode]]'u lexical olarak ayarla.

  10. Değilse, eğer strict true ise, func.[[ThisMode]]'u strict olarak ayarla.

  11. Değilse, func.[[ThisMode]]'u global olarak ayarla.

  12. func.[[IsClassConstructor]]false olarak ayarla.

  13. func.[[Environment]]envRecord olarak ayarla.

  14. func.[[PrivateEnvironment]]privateEnv olarak ayarla.

  15. func.[[ScriptOrModule]]GetActiveScriptOrModule() olarak ayarla.

  16. func.[[Realm]]'i geçerli Realm Record olarak ayarla.

  17. func.[[HomeObject]]'i undefined olarak ayarla.

  18. func.[[Fields]]'ı yeni bir boş Liste olarak ayarla.

  19. func.[[PrivateMethods]]'ı yeni bir boş Liste olarak ayarla.

  20. func.[[ClassFieldInitializerName]]'i empty olarak ayarla.

  21. length = paramList'in ExpectedArgumentCount değeri olsun.

  22. SetFunctionLength(func, length) işlemini gerçekleştir.

  23. func döndür.

10.2.4 AddRestrictedFunctionProperties ( func, realm )

Soyut işlem AddRestrictedFunctionProperties, func (bir işlev nesnesi) ve realm (bir Realm Record) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: realm.[[Intrinsics]].[[%ThrowTypeError%]] mevcuttur ve ilklendirilmiştir.

  2. thrower = realm.[[Intrinsics]].[[%ThrowTypeError%]] olsun.

  3. ! DefinePropertyOrThrow(func, "caller", PropertyDescriptor { [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true }) işlemini gerçekleştir.

  4. ! DefinePropertyOrThrow(func, "arguments", PropertyDescriptor { [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true }) işlemini gerçekleştir.

  5. unused döndür.

10.2.4.1 %ThrowTypeError% ( )

Bu işlev, %ThrowTypeError% içkin nesnesidir.

Her gerçeklik alanı için bir kez tanımlanan anonim, yerleşik bir işlev nesnesidir.

Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Bir TypeError kuraldışı durumu fırlat.

Bu işlevin [[Extensible]] iç yuvasının değeri false'dır.

Bu işlevin "length" özelliği şu niteliklere sahiptir: { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

Bu işlevin "name" özelliği şu niteliklere sahiptir: { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

10.2.5 MakeConstructor ( func [ , writableProto [ , proto ] ] )

Soyut işlem MakeConstructor, func (bir ECMAScript işlev nesnesi veya yerleşik bir işlev nesnesi) argümanını ve isteğe bağlı writableProto (bir Boolean) ve proto (bir Object) argümanlarını alır ve unused döndürür. func'ı bir oluşturucuya dönüştürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer func bir ECMAScript işlev nesnesi ise, o zaman

    1. Assert: IsConstructor(func) false'dır.

    2. Assert: func, "prototype" adında bir kendi özelliği olmayan genişletilebilir bir nesnedir.

    3. func.[[Construct]]10.2.2'de belirtilen tanıma ayarla.

  2. Değilse,

    1. func.[[Construct]]10.3.2'de belirtilen tanıma ayarla.
  3. func.[[ConstructorKind]]base olarak ayarla.

  4. Eğer writableProto mevcut değilse, writableProto'yu true olarak ayarla.

  5. Eğer proto mevcut değilse, o zaman

    1. proto = OrdinaryObjectCreate(%Object.prototype%) olsun.

    2. ! DefinePropertyOrThrow(proto, "constructor", PropertyDescriptor { [[Value]]: func, [[Writable]]: writableProto, [[Enumerable]]: false, [[Configurable]]: true }) işlemini gerçekleştir.

  6. ! DefinePropertyOrThrow(func, "prototype", PropertyDescriptor { [[Value]]: proto, [[Writable]]: writableProto, [[Enumerable]]: false, [[Configurable]]: false }) işlemini gerçekleştir.

  7. unused döndür.

10.2.6 MakeClassConstructor ( func )

Soyut işlem MakeClassConstructor, func (bir ECMAScript işlev nesnesi) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: func.[[IsClassConstructor]] false'dır.

  2. func.[[IsClassConstructor]]true olarak ayarla.

  3. unused döndür.

10.2.7 MakeMethod ( func, homeObj )

Soyut işlem MakeMethod, func (bir ECMAScript işlev nesnesi) ve homeObj (bir Object) argümanlarını alır ve unused döndürür. func'ı bir yöntem olarak yapılandırır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: homeObj bir sıradan nesnedir.

  2. func.[[HomeObject]]'i homeObj olarak ayarla.

  3. unused döndür.

10.2.8 DefineMethodProperty ( homeObj, name, closure, enumerable )

Soyut işlem DefineMethodProperty, homeObj (bir Object), name (bir özellik anahtarı veya Private Name), closure (bir işlev nesnesi) ve enumerable (bir Boolean) argümanlarını alır ve ya bir PrivateElement veya unused içeren normal tamamlanma ya da bir ani tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: homeObj sıradan, genişletilebilir bir nesnedir.

  2. Eğer name bir Private Name ise, PrivateElement { [[Key]]: name, [[Kind]]: method, [[Value]]: closure } döndür.

  3. propertyDesc = PropertyDescriptor { [[Value]]: closure, [[Writable]]: true, [[Enumerable]]: enumerable, [[Configurable]]: true } olsun.

  4. ? DefinePropertyOrThrow(homeObj, name, propertyDesc) işlemini gerçekleştir.

  5. NOTE: DefinePropertyOrThrow, yalnızca name'i "prototype" olan bir sınıf statik yöntemi tanımlanmaya çalışıldığında bir ani tamamlanma döndürür.

  6. unused döndür.

10.2.9 SetFunctionName ( func, name [ , prefix ] )

Soyut işlem SetFunctionName, func (bir işlev nesnesi) ve name (bir özellik anahtarı veya Private Name) argümanlarını ve isteğe bağlı prefix (bir String) argümanını alır ve unused döndürür. func'a bir "name" özelliği ekler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: func, "name" adında bir kendi özelliği olmayan genişletilebilir bir nesnedir.

  2. Eğer name bir Symbol ise, o zaman

    1. description = name.[[Description]] olsun.

    2. Eğer description undefined ise, name'i boş String olarak ayarla.

    3. Değilse, name'i "[", description ve "]"'nin dizgi birleştirmesi olarak ayarla.

  3. Değilse, eğer name bir Private Name ise, o zaman

    1. name = name.[[Description]] olarak ayarla.
  4. Eğer func bir [[InitialName]] iç yuvasına sahipse, o zaman

    1. func.[[InitialName]]'i name olarak ayarla.
  5. Eğer prefix mevcutsa, o zaman

    1. prefixedName = prefix, 0x0020 (BOŞLUK) kod birimi ve name'in dizgi birleştirmesi olsun.

    2. Eğer func bir [[InitialName]] iç yuvasına sahipse, o zaman

      1. NOTE: Aşağıdaki adımdaki seçim, bu Soyut İşlem her çağrıldığında bağımsız olarak yapılır.

      2. func.[[InitialName]]'i, gerçekleştirim tanımlı bir name veya prefixedName seçimi olarak ayarla.

    3. name = prefixedName olarak ayarla.

  6. ! DefinePropertyOrThrow(func, "name", PropertyDescriptor { [[Value]]: name, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }) işlemini gerçekleştir.

  7. unused döndür.

10.2.10 SetFunctionLength ( func, length )

Soyut işlem SetFunctionLength, func (bir işlev nesnesi) ve length (negatif olmayan bir tamsayı veya +∞) argümanlarını alır ve unused döndürür. func'a bir "length" özelliği ekler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: func, "length" adında bir kendi özelliği olmayan genişletilebilir bir nesnedir.

  2. ! DefinePropertyOrThrow(func, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }) işlemini gerçekleştir.

  3. unused döndür.

10.2.11 FunctionDeclarationInstantiation ( func, argList )

Soyut işlem FunctionDeclarationInstantiation, func (bir ECMAScript işlev nesnesi) ve argList (ECMAScript dil değerlerinden oluşan bir Liste) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. func, yürütme bağlamının kurulmakta olduğu işlev nesnesidir.

Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. calleeContext = çalışan yürütme bağlamı olsun.

  2. code = func.[[ECMAScriptCode]] olsun.

  3. strict = func.[[Strict]] olsun.

  4. formals = func.[[FormalParameters]] olsun.

  5. paramNames = formals'ın BoundNames değeri olsun.

  6. Eğer paramNames herhangi bir yinelenen girdi içeriyorsa, hasDuplicates = true olsun; değilse hasDuplicates = false olsun.

  7. simpleParamList = formals'ın IsSimpleParameterList değeri olsun.

  8. hasParamExprs = formals'ın ContainsExpression değeri olsun.

  9. variableNames = code'un VarDeclaredNames değeri olsun.

  10. variableDecls = code'un VarScopedDeclarations değeri olsun.

  11. lexicalNames = code'un LexicallyDeclaredNames değeri olsun.

  12. funcNames = yeni bir boş Liste olsun.

  13. funcsToInitialize = yeni bir boş Liste olsun.

  14. variableDecls'in her bir variableDecl öğesi için, ters Liste sırasında,

    1. Eğer variableDecl ne bir VariableDeclaration, ne bir ForBinding ne de bir BindingIdentifier ise, o zaman

      1. Assert: variableDecl ya bir FunctionDeclaration, bir GeneratorDeclaration, bir AsyncFunctionDeclaration ya da bir AsyncGeneratorDeclaration'dır.

      2. funcName, variableDecl'in BoundNames değerinin yegane öğesi olsun.

      3. Eğer funcNames, funcName'i içermiyorsa, o zaman

         1. *funcName*'i, *funcNames*'in ilk öğesi olarak ekle.
        
         2. [NOTE](06_sec-notational-conventions.md#note-step): Aynı ad için birden fazla işlev bildirimi varsa, son bildirim kullanılır.
        
         3. *variableDecl*'i, *funcsToInitialize*'ın ilk öğesi olarak ekle.
  15. argumentsObjNeeded = true olsun.

  16. Eğer func.[[ThisMode]] lexical ise, o zaman

    1. NOTE: Ok işlevleri asla bir arguments nesnesine sahip değildir.

    2. argumentsObjNeeded = false olarak ayarla.

  17. Değilse, eğer paramNames "arguments" içeriyorsa, o zaman

    1. argumentsObjNeeded = false olarak ayarla.
  18. Değilse, eğer hasParamExprs false ise, o zaman

    1. Eğer funcNames "arguments" içeriyorsa veya lexicalNames "arguments" içeriyorsa, o zaman

      1. argumentsObjNeeded = false olarak ayarla.
  19. Eğer strict true ise veya hasParamExprs false ise, o zaman

    1. NOTE: Parametreler için yalnızca tek bir Ortam Kaydı gereklidir, çünkü katı kip kodunda eval çağrıları, eval dışında görülebilen yeni bağlamalar oluşturamaz.

    2. envRecord = calleeContext'in LexicalEnvironment bileşeni olsun.

  20. Değilse,

    1. NOTE: Biçimsel parametre listesindeki doğrudan eval çağrıları tarafından oluşturulan bağlamaların, parametrelerin bildirildiği ortamın dışında olmasını sağlamak için ayrı bir Ortam Kaydı gereklidir.

    2. calleeEnv = calleeContext'in LexicalEnvironment bileşeni olsun.

    3. envRecord = NewDeclarativeEnvironment(calleeEnv) olsun.

    4. Assert: calleeContext'in VariableEnvironment bileşeni ile calleeEnv aynı Ortam Kaydı'dır.

    5. calleeContext'in LexicalEnvironment bileşenini envRecord olarak ayarla.

  21. paramNames'in her bir String paramName öğesi için,

    1. alreadyDeclared = ! envRecord.HasBinding(paramName) olsun.

    2. NOTE: Erken hatalar, yinelenen parametre adlarının yalnızca parametre varsayılan değerleri veya rest parametreleri olmayan katı olmayan işlevlerde ortaya çıkabilmesini sağlar.

    3. Eğer alreadyDeclared false ise, o zaman

      1. ! envRecord.CreateMutableBinding(paramName, false) işlemini gerçekleştir.

      2. Eğer hasDuplicates true ise, o zaman

         1. ! *envRecord*.[InitializeBinding](10_sec-executable-code-and-execution-contexts.md#abstract-initializebinding)(*paramName*, `undefined`) işlemini gerçekleştir.
  22. Eğer argumentsObjNeeded true ise, o zaman

    1. Eğer strict true ise veya simpleParamList false ise, o zaman

      1. argumentsObj = CreateUnmappedArgumentsObject(argList) olsun.
    2. Değilse,

      1. NOTE: Eşlenmiş bir argüman nesnesi, yalnızca rest parametresi, herhangi bir parametre varsayılan değer ilklendiricisi veya yapıbozuma uğratılmış parametreleri olmayan katı olmayan işlevler için sağlanır.

      2. argumentsObj = CreateMappedArgumentsObject(func, formals, argList, envRecord) olsun.

    3. Eğer strict true ise, o zaman

      1. ! envRecord.CreateImmutableBinding("arguments", false) işlemini gerçekleştir.

      2. NOTE: Katı kip kodunda erken hatalar, bu bağlamaya atama yapılmasını engeller, bu nedenle değişebilirliği gözlemlenemez.

    4. Değilse,

      1. ! envRecord.CreateMutableBinding("arguments", false) işlemini gerçekleştir.
    5. ! envRecord.InitializeBinding("arguments", argumentsObj) işlemini gerçekleştir.

    6. paramBindings = paramNames ile « "arguments" »'nin liste birleştirmesi olsun.

  23. Değilse,

    1. paramBindings = paramNames olsun.
  24. iteratorRecord = CreateListIteratorRecord(argList) olsun.

  25. Eğer hasDuplicates true ise, o zaman

    1. usedEnv = undefined olsun.
  26. Değilse,

    1. usedEnv = envRecord olsun.
  27. NOTE: Aşağıdaki adım bir ReturnCompletion döndüremez, çünkü böyle bir tamamlanmanın ifade konumunda ortaya çıkmasının tek yolu, 15.5.1 ve 15.6.1'deki Erken Hata kuralları tarafından parametre listelerinde yasaklanmış olan YieldExpression kullanımıdır.

  28. ? formals'ın iteratorRecord ve usedEnv argümanlarıyla IteratorBindingInitialization işlemini gerçekleştir.

  29. Eğer hasParamExprs false ise, o zaman

    1. NOTE: Parametreler ve en üst düzey var'lar için yalnızca tek bir Ortam Kaydı gereklidir.

    2. instantiatedVariableNames, Liste paramBindings'in bir kopyası olsun.

    3. variableNames'in her bir n öğesi için,

      1. Eğer instantiatedVariableNames, n'i içermiyorsa, o zaman

         1. *n*'i *instantiatedVariableNames*'a ekle.
        
         2. ! *envRecord*.[CreateMutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createmutablebinding)(*n*, `false`) işlemini gerçekleştir.
        
         3. ! *envRecord*.[InitializeBinding](10_sec-executable-code-and-execution-contexts.md#abstract-initializebinding)(*n*, `undefined`) işlemini gerçekleştir.
    4. variableEnv = envRecord olsun.

  30. Değilse,

    1. NOTE: Biçimsel parametre listesindeki ifadeler tarafından oluşturulan kapanışların, işlev gövdesindeki bildirimleri görmemesini sağlamak için ayrı bir Ortam Kaydı gereklidir.

    2. variableEnv = NewDeclarativeEnvironment(envRecord) olsun.

    3. calleeContext'in VariableEnvironment bileşenini variableEnv olarak ayarla.

    4. instantiatedVariableNames = yeni bir boş Liste olsun.

    5. variableNames'in her bir n öğesi için,

      1. Eğer instantiatedVariableNames, n'i içermiyorsa, o zaman

         1. *n*'i *instantiatedVariableNames*'a ekle.
        
         2. ! *variableEnv*.[CreateMutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createmutablebinding)(*n*, `false`) işlemini gerçekleştir.
        
         3. Eğer *paramBindings*, *n*'i içermiyorsa veya *funcNames*, *n*'i içeriyorsa, o zaman
           
                   1. *initialValue* = `undefined` olsun.
        
         4. Değilse,
           
                   1. *initialValue* = ! *envRecord*.[GetBindingValue](10_sec-executable-code-and-execution-contexts.md#abstract-getbindingvalue)(*n*, `false`) olsun.
        
         5. ! *variableEnv*.[InitializeBinding](10_sec-executable-code-and-execution-contexts.md#abstract-initializebinding)(*n*, *initialValue*) işlemini gerçekleştir.
        
         6. [NOTE](06_sec-notational-conventions.md#note-step): Bir biçimsel parametre ile aynı ada sahip bir var, başlangıçta karşılık gelen ilklendirilmiş parametre ile aynı değere sahiptir.
  31. Eğer strict true ise, o zaman

    1. lexicalEnv = variableEnv olsun.
  32. Değilse,

    1. Normative OptionalEğer konak bir web tarayıcısı ise veya Blok Düzeyinde İşlev Bildirimleri Web Eski Uyumluluk Anlambilimini başka şekilde destekliyorsa, o zaman

      1. code'un Contains x değeri true olan herhangi bir Block, CaseClause veya DefaultClause x'inin StatementList'inde doğrudan bulunan her FunctionDeclaration funcDecl için,

         1. *funcName*, *funcDecl*'in *[BindingIdentifier](14_sec-ecmascript-language-expressions.md#prod-BindingIdentifier)*'ının [StringValue](14_sec-ecmascript-language-expressions.md#sec-static-semantics-stringvalue) değeri olsun.
        
         2. Eğer *[FunctionDeclaration](16_sec-ecmascript-language-functions-and-classes.md#prod-FunctionDeclaration)* *funcDecl*'i, *funcName*'i bir *[BindingIdentifier](14_sec-ecmascript-language-expressions.md#prod-BindingIdentifier)* olarak alan bir *[VariableStatement](15_sec-ecmascript-language-statements-and-declarations.md#prod-VariableStatement)* ile değiştirmek, *func* için herhangi bir Erken Hata üretmiyorsa ve *paramNames*, *funcName*'i içermiyorsa, o zaman
           
                   1. [NOTE](06_sec-notational-conventions.md#note-step): *funcName* için bir var bağlaması, yalnızca ne bir VarDeclaredName, ne bir biçimsel parametrenin adı ne de başka bir *[FunctionDeclaration](16_sec-ecmascript-language-functions-and-classes.md#prod-FunctionDeclaration)* ise burada somutlaştırılır.
           
                   2. Eğer *instantiatedVariableNames*, *funcName*'i içermiyorsa ve *funcName* `"arguments"` değilse, o zaman
                     
                               1. ! *variableEnv*.[CreateMutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createmutablebinding)(*funcName*, `false`) işlemini gerçekleştir.
                     
                               2. ! *variableEnv*.[InitializeBinding](10_sec-executable-code-and-execution-contexts.md#abstract-initializebinding)(*funcName*, `undefined`) işlemini gerçekleştir.
                     
                               3. *funcName*'i *instantiatedVariableNames*'a ekle.
           
                   3. *[FunctionDeclaration](16_sec-ecmascript-language-functions-and-classes.md#prod-FunctionDeclaration)* *funcDecl* değerlendirildiğinde, [15.2.6](16_sec-ecmascript-language-functions-and-classes.md#sec-function-definitions-runtime-semantics-evaluation)'da sağlanan *[FunctionDeclaration](16_sec-ecmascript-language-functions-and-classes.md#prod-FunctionDeclaration)* [Evaluation](09_sec-syntax-directed-operations.md#sec-evaluation) algoritmasının yerine aşağıdaki adımları gerçekleştir:
                     
                               1. *fEnv* = [çalışan yürütme bağlamının](10_sec-executable-code-and-execution-contexts.md#running-execution-context) VariableEnvironment bileşeni olsun.
                     
                               2. *bEnv* = [çalışan yürütme bağlamının](10_sec-executable-code-and-execution-contexts.md#running-execution-context) LexicalEnvironment bileşeni olsun.
                     
                               3. *fObj* = ! *bEnv*.[GetBindingValue](10_sec-executable-code-and-execution-contexts.md#abstract-getbindingvalue)(*funcName*, `false`) olsun.
                     
                               4. ! *fEnv*.[SetMutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-setmutablebinding)(*funcName*, *fObj*, `false`) işlemini gerçekleştir.
                     
                               5. `unused` döndür.
    2. lexicalEnv = NewDeclarativeEnvironment(variableEnv) olsun.

    3. NOTE: Katı olmayan işlevler, en üst düzey sözcüksel bildirimler için ayrı bir Ortam Kaydı kullanır, böylece bir doğrudan eval, eval kodu tarafından getirilen herhangi bir var kapsamlı bildirimin önceden var olan en üst düzey sözcüksel kapsamlı bildirimlerle çakışıp çakışmadığını belirleyebilir. Bu, katı işlevler için gerekli değildir, çünkü katı bir doğrudan eval her zaman tüm bildirimleri yeni bir Ortam Kaydı içine yerleştirir.

  33. calleeContext'in LexicalEnvironment bileşenini lexicalEnv olarak ayarla.

  34. lexicalDecls = code'un LexicallyScopedDeclarations değeri olsun.

  35. lexicalDecls'in her bir lexicalDecl öğesi için,

    1. NOTE: Sözcüksel olarak bildirilen bir ad, bir işlev/üreteç bildirimi, biçimsel parametre veya bir var adı ile aynı olamaz. Sözcüksel olarak bildirilen adlar burada yalnızca somutlaştırılır, ilklendirilmez.

    2. lexicalDecl'in BoundNames değerinin her bir dn öğesi için,

      1. Eğer lexicalDecl'in IsConstantDeclaration değeri true ise, o zaman

         1. ! *lexicalEnv*.[CreateImmutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createimmutablebinding)(*dn*, `true`) işlemini gerçekleştir.
      2. Değilse,

         1. ! *lexicalEnv*.[CreateMutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createmutablebinding)(*dn*, `false`) işlemini gerçekleştir.
  36. privateEnv = calleeContext'in PrivateEnvironment bileşeni olsun.

  37. funcsToInitialize'ın her bir Parse Node funcDecl öğesi için,

    1. funcName, funcDecl'in BoundNames değerinin yegane öğesi olsun.

    2. funcObj = funcDecl'in lexicalEnv ve privateEnv argümanlarıyla InstantiateFunctionObject değeri olsun.

    3. ! variableEnv.SetMutableBinding(funcName, funcObj, false) işlemini gerçekleştir.

  38. unused döndür.

10.3 Yerleşik İşlev Nesneleri

Yerleşik bir işlev nesnesi, bir sıradan nesnedir; 10.1'de belirtilen sıradan nesneler için gereklilikleri karşılamak zorundadır.

Her sıradan nesnenin gerektirdiği iç yuvalara ek olarak (bkz. 10.1), yerleşik bir işlev nesnesi aşağıdaki iç yuvalara da sahip olmak zorundadır:

  • [[Realm]], işlevin oluşturulduğu gerçeklik alanını temsil eden bir Realm Record.

  • [[InitialName]], işlevin başlangıç adı olan bir String. 20.2.3.5 tarafından kullanılır.

  • [[Async]], işlevin BuiltinCallOrConstruct içinde async işlev çağrısı ve oluşturma davranışına sahip olup olmadığını belirten bir Boolean.

Aksi belirtilmedikçe, yerleşik bir işlev nesnesinin [[Prototype]] iç yuvasının başlangıç değeri %Function.prototype%'dır.

Yerleşik bir işlev nesnesi, 10.3.1'deki tanıma uyan bir [[Call]] iç yöntemine sahip olmak zorundadır.

Yerleşik bir işlev nesnesi, yalnızca bir “oluşturucu” olarak tanımlanmışsa veya bu belirtimdeki bir algoritma açıkça onun [[Construct]] iç yöntemini ayarlarsa bir [[Construct]] iç yöntemine sahiptir. Böyle bir [[Construct]] iç yöntemi, 10.3.2'deki tanıma uymak zorundadır.

Bir gerçekleştirim, bu belirtimde tanımlanmayan ek yerleşik işlev nesneleri sağlayabilir.

10.3.1 [[Call]] ( thisArg, argList )

Yerleşik bir işlev nesnesi func'ın [[Call]] iç yöntemi, thisArg (bir ECMAScript dil değeri) ve argList (ECMAScript dil değerlerinden oluşan bir Liste) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? BuiltinCallOrConstruct(func, thisArg, argList, undefined) döndür.

10.3.2 [[Construct]] ( argList, newTarget )

Yerleşik bir işlev nesnesi func'ın (yöntem mevcut olduğunda) [[Construct]] iç yöntemi, argList (ECMAScript dil değerlerinden oluşan bir Liste) ve newTarget (bir oluşturucu) argümanlarını alır ve ya bir Object içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. result = ? BuiltinCallOrConstruct(func, uninitialized, argList, newTarget) olsun.

  2. Assert: result bir Object'tir.

  3. result döndür.

10.3.3 BuiltinCallOrConstruct ( func, thisArg, argList, newTarget )

Soyut işlem BuiltinCallOrConstruct, func (yerleşik bir işlev nesnesi), thisArg (bir ECMAScript dil değeri veya uninitialized), argList (ECMAScript dil değerlerinden oluşan bir Liste) ve newTarget (bir oluşturucu veya undefined) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. callerContext = çalışan yürütme bağlamı olsun.

  2. Eğer callerContext zaten askıya alınmamışsa, callerContext'i askıya al.

  3. calleeContext, yeni bir yürütme bağlamı olsun.

  4. calleeContext'in Function bileşenini func olarak ayarla.

  5. calleeRealm = func.[[Realm]] olsun.

  6. calleeContext'in Realm bileşenini calleeRealm olarak ayarla.

  7. calleeContext'in ScriptOrModule bileşenini null olarak ayarla.

  8. calleeContext'in gerekli gerçekleştirim tanımlı ilklendirmesini gerçekleştir.

  9. calleeContext'i yürütme bağlamı yığınına it; calleeContext artık çalışan yürütme bağlamıdır.

  10. Eğer func.[[Async]] true ise, o zaman

    1. promiseCapability = ! NewPromiseCapability(%Promise%) olsun.

    2. resultsClosure, func, thisArg, argList ve newTarget'i yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren, parametresiz yeni bir Abstract Closure olsun:

      1. result, func'ın belirtimine uygun bir şekilde func'ı değerlendirmenin sonucu olan Completion Record olsun. Eğer thisArg uninitialized ise, this değeri ilklendirilmemiştir; değilse, thisArg this değerini sağlar. argList adlandırılmış parametreleri sağlar. newTarget, NewTarget değerini sağlar.

      2. NOTE: Eğer func bu belgede tanımlanmışsa, “func'ın belirtimi”, onun için algoritma adımları veya diğer yollarla belirtilen davranıştır.

      3. Completion(result) döndür.

    3. AsyncFunctionStart(promiseCapability, resultsClosure) işlemini gerçekleştir.

    4. calleeContext'i yürütme bağlamı yığınından kaldır ve callerContext'i çalışan yürütme bağlamı olarak geri yükle.

    5. promiseCapability.[[Promise]] döndür.

  11. result, func'ın belirtimine uygun bir şekilde func'ı değerlendirmenin sonucu olan Completion Record olsun. Eğer thisArg uninitialized ise, this değeri ilklendirilmemiştir; değilse, thisArg this değerini sağlar. argList adlandırılmış parametreleri sağlar. newTarget, NewTarget değerini sağlar.

  12. NOTE: Eğer func bu belgede tanımlanmışsa, “func'ın belirtimi”, onun için algoritma adımları veya diğer yollarla belirtilen davranıştır.

  13. calleeContext'i yürütme bağlamı yığınından kaldır ve callerContext'i çalışan yürütme bağlamı olarak geri yükle.

  14. ? result döndür.

10.3.4 CreateBuiltinFunction ( behaviour, length, name, additionalInternalSlotsList [ , realm [ , proto [ , prefix [ , async ] ] ] ] )

Soyut işlem CreateBuiltinFunction, behaviour (bir Abstract Closure, bir dizi algoritma adımı veya bu belirtimde sağlanan bir işlevin davranışının başka bir tanımı), length (negatif olmayan bir tamsayı veya +∞), name (bir özellik anahtarı veya bir Private Name) ve additionalInternalSlotsList (iç yuva adlarından oluşan bir Liste) argümanlarını ve isteğe bağlı realm (bir Realm Record), proto (bir Object veya null), prefix (bir String) ve async (bir Boolean) argümanlarını alır ve yerleşik bir işlev nesnesi döndürür. additionalInternalSlotsList, nesnenin parçası olarak tanımlanması gereken ek iç yuvaların adlarını içerir. Bu işlem, yerleşik bir işlev nesnesi oluşturur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer realm mevcut değilse, realm = geçerli Realm Record olarak ayarla.

  2. Eğer proto mevcut değilse, proto = realm.[[Intrinsics]].[[%Function.prototype%]] olarak ayarla.

  3. Eğer async mevcut değilse, async = false olarak ayarla.

  4. internalSlotsList, 10.3'ün oluşturulmak üzere olan yerleşik işlev nesnesi için gerektirdiği tüm iç yuvaların adlarını içeren bir Liste olsun.

  5. additionalInternalSlotsList'in öğelerini internalSlotsList'e ekle.

  6. func, çağrıldığında, behaviour tarafından belirtilen ilgili parametrelerin değerleri olarak sağlanan argümanları kullanarak behaviour tarafından açıklanan eylemi gerçekleştiren yeni bir yerleşik işlev nesnesi olsun. Yeni işlev nesnesi, adları internalSlotsList'in öğeleri olan iç yuvalara ve bir [[InitialName]] iç yuvasına sahiptir.

  7. func.[[Async]]async olarak ayarla.

  8. func.[[Prototype]]proto olarak ayarla.

  9. func.[[Extensible]]true olarak ayarla.

  10. func.[[Realm]]'i realm olarak ayarla.

  11. func.[[InitialName]]'i null olarak ayarla.

  12. SetFunctionLength(func, length) işlemini gerçekleştir.

  13. Eğer prefix mevcut değilse, o zaman

    1. SetFunctionName(func, name) işlemini gerçekleştir.
  14. Değilse,

    1. SetFunctionName(func, name, prefix) işlemini gerçekleştir.
  15. func döndür.

Bu belirtimde tanımlanan her yerleşik işlev, CreateBuiltinFunction soyut işlemi çağrılarak oluşturulur.

10.4 Yerleşik Egzotik Nesne İç Yöntemleri ve Yuvaları

Bu belirtim, birkaç tür yerleşik egzotik nesne tanımlar. Bu nesneler, birkaç belirli durum dışında genellikle sıradan nesnelere benzer davranır. Aşağıdaki egzotik nesneler, aşağıda açıkça aksi belirtilmedikçe sıradan nesne iç yöntemlerini kullanır:

10.4.1 Bağlı İşlev Egzotik Nesneleri

Bir bağlı işlev egzotik nesnesi, başka bir işlev nesnesini sarmalayan bir egzotik nesnedir. Bir bağlı işlev egzotik nesnesi çağrılabilirdir (bir [[Call]] iç yöntemine sahiptir ve bir [[Construct]] iç yöntemine sahip olabilir). Bir bağlı işlev egzotik nesnesini çağırmak genellikle sarmalanmış işlevinin bir çağrısıyla sonuçlanır.

Bir nesne, eğer [[Call]] ve (varsa) [[Construct]] iç yöntemleri aşağıdaki gerçekleştirimleri kullanıyorsa ve diğer temel iç yöntemleri 10.1'de bulunan tanımları kullanıyorsa, bir bağlı işlev egzotik nesnesidir. Bu yöntemler BoundFunctionCreate içinde kurulur.

Bağlı işlev egzotik nesneleri, Tablo 25'te listelenen ECMAScript işlev nesnelerinin iç yuvalarına sahip değildir. Bunun yerine, [[Prototype]] ve [[Extensible]]'a ek olarak Tablo 26'da listelenen iç yuvalara sahiptirler.

Tablo 26: Bağlı İşlev Egzotik Nesnelerinin İç Yuvaları

İç Yuva Tür Açıklama
[[BoundTargetFunction]] çağrılabilir bir Object Sarmalanmış işlev nesnesi.
[[BoundThis]] bir ECMAScript dil değeri Sarmalanmış işlev çağrılırken her zaman this değeri olarak geçirilen değer.
[[BoundArguments]] ECMAScript dil değerlerinden oluşan bir Liste Sarmalanmış işleve yapılan herhangi bir çağrıda ilk argümanlar olarak kullanılan değerlerin bir listesi.

10.4.1.1 [[Call]] ( thisArg, argList )

Bir bağlı işlev egzotik nesnesi func'ın [[Call]] iç yöntemi, thisArg (bir ECMAScript dil değeri) ve argList (ECMAScript dil değerlerinden oluşan bir Liste) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. target = func.[[BoundTargetFunction]] olsun.

  2. boundThis = func.[[BoundThis]] olsun.

  3. boundArgs = func.[[BoundArguments]] olsun.

  4. args = boundArgs ile argList'in liste birleştirmesi olsun.

  5. ? Call(target, boundThis, args) döndür.

10.4.1.2 [[Construct]] ( argList, newTarget )

Bir bağlı işlev egzotik nesnesi func'ın [[Construct]] iç yöntemi, argList (ECMAScript dil değerlerinden oluşan bir Liste) ve newTarget (bir oluşturucu) argümanlarını alır ve ya bir Object içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. target = func.[[BoundTargetFunction]] olsun.

  2. Assert: IsConstructor(target) true'dur.

  3. boundArgs = func.[[BoundArguments]] olsun.

  4. args = boundArgs ile argList'in liste birleştirmesi olsun.

  5. Eğer SameValue(func, newTarget) true ise, newTarget = target olarak ayarla.

  6. ? Construct(target, args, newTarget) döndür.

10.4.1.3 BoundFunctionCreate ( targetFunc, boundThis, boundArgs )

Soyut işlem BoundFunctionCreate, targetFunc (bir işlev nesnesi), boundThis (bir ECMAScript dil değeri) ve boundArgs (ECMAScript dil değerlerinden oluşan bir Liste) argümanlarını alır ve ya bir işlev nesnesi içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Yeni bağlı işlev egzotik nesnelerinin oluşturulmasını belirtmek için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. proto = ? targetFunc.[[GetPrototypeOf]]() olsun.

  2. internalSlotsList = « [[Prototype]], [[Extensible]] » ile Tablo 26'da listelenen iç yuvaların liste birleştirmesi olsun.

  3. obj = MakeBasicObject(internalSlotsList) olsun.

  4. obj.[[Prototype]]proto olarak ayarla.

  5. obj.[[Call]]10.4.1.1'de belirtildiği gibi ayarla.

  6. Eğer IsConstructor(targetFunc) true ise, o zaman

    1. obj.[[Construct]]10.4.1.2'de belirtildiği gibi ayarla.
  7. obj.[[BoundTargetFunction]]targetFunc olarak ayarla.

  8. obj.[[BoundThis]]boundThis olarak ayarla.

  9. obj.[[BoundArguments]]boundArgs olarak ayarla.

  10. obj döndür.

10.4.2 Dizi Egzotik Nesneleri

Bir Dizi, dizi indisi özellik anahtarlarına özel işlem uygulayan bir egzotik nesnedir (bkz. 6.1.7). Özellik adı bir dizi indisi olan bir özelliğe aynı zamanda öğe denir. Her Dizi, değeri her zaman matematiksel değeri kesin olarak 232'den küçük, negatif olmayan bir tam sayı Number olan, yapılandırılamaz bir "length" özelliğine sahiptir. "length" özelliğinin değeri, adı bir dizi indisi olan her kendi özelliğinin adından sayısal olarak daha büyüktür; bir Dizinin bir kendi özelliği oluşturulduğunda veya değiştirildiğinde, bu değişmezi korumak için diğer özellikler gerektiği gibi ayarlanır. Özellikle, adı bir dizi indisi olan bir kendi özelliği eklendiğinde, "length" özelliğinin değeri, gerekirse, o dizi indisinin sayısal değerinden bir fazla olacak şekilde değiştirilir; ve "length" özelliğinin değeri değiştirildiğinde, adı bir dizi indisi olan ve değeri yeni uzunluktan küçük olmayan her kendi özelliği silinir. Bu kısıtlama yalnızca bir Dizinin kendi özelliklerine uygulanır ve prototiplerinden kalıtılabilecek "length" veya dizi indisi özelliklerinden etkilenmez.

Bir nesne, eğer [[DefineOwnProperty]] iç yöntemi aşağıdaki gerçekleştirimi kullanıyorsa ve diğer temel iç yöntemleri 10.1'de bulunan tanımları kullanıyorsa, bir Dizi egzotik nesnesidir (veya basitçe, bir Dizi). Bu yöntemler ArrayCreate içinde kurulur.

10.4.2.1 [[DefineOwnProperty]] ( propertyKey, propertyDesc )

Bir Dizi egzotik nesnesi array'in [[DefineOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) ve propertyDesc (bir Property Descriptor) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey "length" ise, ? ArraySetLength(array, propertyDesc) döndür.

  2. Eğer propertyKey bir dizi indisi ise, o zaman

    1. lengthDesc = OrdinaryGetOwnProperty(array, "length") olsun.

    2. Assert: lengthDesc undefined değildir.

    3. Assert: IsDataDescriptor(lengthDesc) true'dur.

    4. Assert: lengthDesc.[[Configurable]] false'dır.

    5. length = lengthDesc.[[Value]] olsun.

    6. Assert: length, negatif olmayan bir tam sayı Number'dır.

    7. index = ! ToUint32(propertyKey) olsun.

    8. Eğer indexlength ve lengthDesc.[[Writable]] false ise, false döndür.

    9. succeeded = ! OrdinaryDefineOwnProperty(array, propertyKey, propertyDesc) olsun.

    10. Eğer succeeded false ise, false döndür.

    11. Eğer indexlength ise, o zaman

      1. lengthDesc.[[Value]] = index + 1𝔽 olarak ayarla.

      2. succeeded = ! OrdinaryDefineOwnProperty(array, "length", lengthDesc) olarak ayarla.

      3. Assert: succeeded true'dur.

    12. true döndür.

  3. ? OrdinaryDefineOwnProperty(array, propertyKey, propertyDesc) döndür.

10.4.2.2 ArrayCreate ( length [ , proto ] )

Soyut işlem ArrayCreate, length (negatif olmayan bir tamsayı) argümanını ve isteğe bağlı proto (bir Object) argümanını alır ve ya bir Dizi egzotik nesnesi içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Yeni Dizilerin oluşturulmasını belirtmek için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer length > 232 - 1 ise, bir RangeError kuraldışı durumu fırlat.

  2. Eğer proto mevcut değilse, proto = %Array.prototype% olarak ayarla.

  3. array = MakeBasicObject[[Prototype]], [[Extensible]] ») olsun.

  4. array.[[Prototype]]proto olarak ayarla.

  5. array.[[DefineOwnProperty]]'yi 10.4.2.1'de belirtildiği gibi ayarla.

  6. ! OrdinaryDefineOwnProperty(array, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) işlemini gerçekleştir.

  7. array döndür.

10.4.2.3 ArraySpeciesCreate ( originalArray, length )

Soyut işlem ArraySpeciesCreate, originalArray (bir Object) ve length (negatif olmayan bir tamsayı) argümanlarını alır ve ya bir Object içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. originalArray'den türetilen bir oluşturucu işlevi kullanarak yeni bir Dizi veya benzeri bir nesnenin oluşturulmasını belirtmek için kullanılır. Oluşturucu işlevinin bir Dizi döndürmesini zorunlu kılmaz. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. isArray = ? IsArray(originalArray) olsun.

  2. Eğer isArray false ise, ? ArrayCreate(length) döndür.

  3. ctor = ? Get(originalArray, "constructor") olsun.

  4. Eğer IsConstructor(ctor) true ise, o zaman

    1. thisRealm = geçerli Realm Record olsun.

    2. ctorRealm = ? GetFunctionRealm(ctor) olsun.

    3. Eğer thisRealm ve ctorRealm aynı Realm Record değilse, o zaman

      1. Eğer SameValue(ctor, ctorRealm.[[Intrinsics]].[[%Array%]]) true ise, ctor = undefined olarak ayarla.
  5. Eğer ctor bir Object ise, o zaman

    1. ctor = ? Get(ctor, %Symbol.species%) olarak ayarla.

    2. Eğer ctor null ise, ctor = undefined olarak ayarla.

  6. Eğer ctor undefined ise, ? ArrayCreate(length) döndür.

  7. Eğer IsConstructor(ctor) false ise, bir TypeError kuraldışı durumu fırlat.

  8. ? Construct(ctor, « 𝔽(length) ») döndür.

10.4.2.4 ArraySetLength ( array, propertyDesc )

Soyut işlem ArraySetLength, array (bir Dizi) ve propertyDesc (bir Property Descriptor) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyDesc bir [[Value]] alanına sahip değilse, o zaman

    1. ! OrdinaryDefineOwnProperty(array, "length", propertyDesc) döndür.
  2. newLengthDesc = propertyDesc'in bir kopyası olsun.

  3. newLength = ? ToUint32(propertyDesc.[[Value]]) olsun.

  4. numberLength = ? ToNumber(propertyDesc.[[Value]]) olsun.

  5. Eğer SameValueZero(newLength, numberLength) false ise, bir RangeError kuraldışı durumu fırlat.

  6. newLengthDesc.[[Value]] = newLength olarak ayarla.

  7. oldLengthDesc = OrdinaryGetOwnProperty(array, "length") olsun.

  8. Assert: oldLengthDesc undefined değildir.

  9. Assert: IsDataDescriptor(oldLengthDesc) true'dur.

  10. Assert: oldLengthDesc.[[Configurable]] false'dır.

  11. oldLength = oldLengthDesc.[[Value]] olsun.

  12. Eğer newLengtholdLength ise, o zaman

    1. ! OrdinaryDefineOwnProperty(array, "length", newLengthDesc) döndür.
  13. Eğer oldLengthDesc.[[Writable]] false ise, false döndür.

  14. Eğer newLengthDesc bir [[Writable]] alanına sahip değilse veya newLengthDesc.[[Writable]] true ise, o zaman

    1. newWritable = true olsun.
  15. Değilse,

    1. NOTE: [[Writable]] niteliğini false olarak ayarlamak, herhangi bir öğenin silinememesi durumunda ertelenir.

    2. newWritable = false olsun.

    3. newLengthDesc.[[Writable]] = true olarak ayarla.

  16. succeeded = ! OrdinaryDefineOwnProperty(array, "length", newLengthDesc) olsun.

  17. Eğer succeeded false ise, false döndür.

  18. array'in, propertyKey bir dizi indisi olan ve ! ToUint32(propertyKey) ≥ newLength olan her kendi özellik anahtarı propertyKey için, azalan sayısal indis sırasında,

    1. deleteSucceeded = ! array.[[Delete]](propertyKey) olsun.

    2. Eğer deleteSucceeded false ise, o zaman

      1. newLengthDesc.[[Value]] = ! ToUint32(propertyKey) + 1𝔽 olarak ayarla.

      2. Eğer newWritable false ise, newLengthDesc.[[Writable]] = false olarak ayarla.

      3. ! OrdinaryDefineOwnProperty(array, "length", newLengthDesc) işlemini gerçekleştir.

      4. false döndür.

  19. Eğer newWritable false ise, o zaman

    1. succeeded = ! OrdinaryDefineOwnProperty(array, "length", PropertyDescriptor { [[Writable]]: false }) olarak ayarla.

    2. Assert: succeeded true'dur.

  20. true döndür.

10.4.3 Dizgi Egzotik Nesneleri

Bir String nesnesi, bir String değerini kapsülleyen ve String değerinin bireysel kod birimi öğelerine karşılık gelen sanal tamsayı indisli veri özelliklerini açığa çıkaran bir egzotik nesnedir. Dizgi egzotik nesneleri, değeri kapsüllenen String değerinin uzunluğu olan, her zaman "length" adında bir veri özelliğine sahiptir. Hem kod birimi veri özellikleri hem de "length" özelliği yazılamaz ve yapılandırılamazdır.

Bir nesne, eğer [[GetOwnProperty]], [[DefineOwnProperty]] ve [[OwnPropertyKeys]] iç yöntemleri aşağıdaki gerçekleştirimleri kullanıyorsa ve diğer temel iç yöntemleri 10.1'de bulunan tanımları kullanıyorsa, bir Dizgi egzotik nesnesidir (veya basitçe, bir String nesnesi). Bu yöntemler StringCreate içinde kurulur.

Dizgi egzotik nesneleri, sıradan nesnelerle aynı iç yuvalara sahiptir. Ayrıca bir [[StringData]] iç yuvasına sahiptirler.

10.4.3.1 [[GetOwnProperty]] ( propertyKey )

Bir Dizgi egzotik nesnesi string'in [[GetOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Property Descriptor ya da undefined içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. propertyDesc = OrdinaryGetOwnProperty(string, propertyKey) olsun.

  2. Eğer propertyDesc undefined değilse, propertyDesc döndür.

  3. StringGetOwnProperty(string, propertyKey) döndür.

10.4.3.2 [[DefineOwnProperty]] ( propertyKey, propertyDesc )

Bir Dizgi egzotik nesnesi string'in [[DefineOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) ve propertyDesc (bir Property Descriptor) argümanlarını alır ve bir Boolean içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. stringDesc = StringGetOwnProperty(string, propertyKey) olsun.

  2. Eğer stringDesc undefined değilse, o zaman

    1. extensible = string.[[Extensible]] olsun.

    2. IsCompatiblePropertyDescriptor(extensible, propertyDesc, stringDesc) döndür.

  3. ! OrdinaryDefineOwnProperty(string, propertyKey, propertyDesc) döndür.

10.4.3.3 [[OwnPropertyKeys]] ( )

Bir Dizgi egzotik nesnesi obj'nin [[OwnPropertyKeys]] iç yöntemi hiçbir argüman almaz ve özellik anahtarlarından oluşan bir Liste içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. keys = yeni bir boş Liste olsun.

  2. string = obj.[[StringData]] olsun.

  3. Assert: string bir String'dir.

  4. length = string'in uzunluğu olsun.

  5. 0 ≤ i < length olacak şekildeki her tamsayı i için, artan sırada,

    1. ! ToString(𝔽(i)) değerini keys'e ekle.
  6. obj'nin, propertyKey bir dizi indisi olan ve ! ToIntegerOrInfinity(propertyKey) ≥ length olan her kendi özellik anahtarı propertyKey için, artan sayısal indis sırasında,

    1. propertyKey'i keys'e ekle.
  7. obj'nin, propertyKey bir String olan ve bir dizi indisi olmayan her kendi özellik anahtarı propertyKey için, özellik oluşturmanın artan kronolojik sırasında,

    1. propertyKey'i keys'e ekle.
  8. obj'nin, propertyKey bir Symbol olan her kendi özellik anahtarı propertyKey için, özellik oluşturmanın artan kronolojik sırasında,

    1. propertyKey'i keys'e ekle.
  9. keys döndür.

10.4.3.4 StringCreate ( value, proto )

Soyut işlem StringCreate, value (bir String) ve proto (bir Object) argümanlarını alır ve bir Dizgi egzotik nesnesi döndürür. Yeni Dizgi egzotik nesnelerinin oluşturulmasını belirtmek için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. string = MakeBasicObject[[Prototype]], [[Extensible]], [[StringData]] ») olsun.

  2. string.[[Prototype]]proto olarak ayarla.

  3. string.[[StringData]]'yı value olarak ayarla.

  4. string.[[GetOwnProperty]]'yi 10.4.3.1'de belirtildiği gibi ayarla.

  5. string.[[DefineOwnProperty]]'yi 10.4.3.2'de belirtildiği gibi ayarla.

  6. string.[[OwnPropertyKeys]]'i 10.4.3.3'te belirtildiği gibi ayarla.

  7. length = value'nun uzunluğu olsun.

  8. ! DefinePropertyOrThrow(string, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }) işlemini gerçekleştir.

  9. string döndür.

10.4.3.5 StringGetOwnProperty ( string, propertyKey )

Soyut işlem StringGetOwnProperty, string (bir [[StringData]] iç yuvasına sahip bir Object) ve propertyKey (bir özellik anahtarı) argümanlarını alır ve bir Property Descriptor veya undefined döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir String değilse, undefined döndür.

  2. numericIndex = CanonicalNumericIndexString(propertyKey) olsun.

  3. Eğer numericIndex bir tam sayı Number değilse, undefined döndür.

  4. Eğer numericIndex -0𝔽 veya numericIndex < -0𝔽 ise, undefined döndür.

  5. stringData = string.[[StringData]] olsun.

  6. Assert: stringData bir String'dir.

  7. length = stringData'nın uzunluğu olsun.

  8. Eğer (numericIndex) ≥ length ise, undefined döndür.

  9. resultString = stringData'nın (numericIndex)'ten (numericIndex) + 1'e kadar olan alt dizgisi olsun.

  10. PropertyDescriptor { [[Value]]: resultString, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false } döndür.

10.4.4 Argüman Egzotik Nesneleri

Çoğu ECMAScript işlevi, kodlarına bir argüman nesnesi sunar. İşlev tanımının özelliklerine bağlı olarak, argüman nesnesi ya bir sıradan nesne ya da bir argüman egzotik nesnesidir. Bir argüman egzotik nesnesi, dizi indisi özellikleri, ilişkili ECMAScript işlevinin bir çağrısının biçimsel parametre bağlamalarıyla eşlenen bir egzotik nesnedir.

Bir nesne, iç yöntemleri aşağıdaki gerçekleştirimleri kullanıyorsa, burada belirtilmeyenler 10.1'de bulunanları kullanıyorsa, bir argüman egzotik nesnesidir. Bu yöntemler CreateMappedArgumentsObject içinde kurulur.

Argüman egzotik nesneleri, sıradan nesnelerle aynı iç yuvalara sahiptir. Ayrıca bir [[ParameterMap]] iç yuvasına sahiptirler. Sıradan argüman nesneleri de değeri her zaman undefined olan bir [[ParameterMap]] iç yuvasına sahiptir. Sıradan argüman nesneleri için [[ParameterMap]] iç yuvası, yalnızca Object.prototype.toString (20.1.3.6) tarafından onları bu şekilde tanımlamak için kullanılır.

10.4.4.1 [[GetOwnProperty]] ( propertyKey )

Bir argüman egzotik nesnesi args'ın [[GetOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Property Descriptor ya da undefined içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. propertyDesc = OrdinaryGetOwnProperty(args, propertyKey) olsun.

  2. Eğer propertyDesc undefined ise, undefined döndür.

  3. map = args.[[ParameterMap]] olsun.

  4. isMapped = ! HasOwnProperty(map, propertyKey) olsun.

  5. Eğer isMapped true ise, o zaman

    1. propertyDesc.[[Value]] = ! Get(map, propertyKey) olarak ayarla.
  6. propertyDesc döndür.

10.4.4.2 [[DefineOwnProperty]] ( propertyKey, propertyDesc )

Bir argüman egzotik nesnesi args'ın [[DefineOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) ve propertyDesc (bir Property Descriptor) argümanlarını alır ve bir Boolean içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. map = args.[[ParameterMap]] olsun.

  2. isMapped = ! HasOwnProperty(map, propertyKey) olsun.

  3. newArgDesc = propertyDesc olsun.

  4. Eğer isMapped true ise ve IsDataDescriptor(propertyDesc) true ise, o zaman

    1. Eğer propertyDesc bir [[Value]] alanına sahip değilse, propertyDesc bir [[Writable]] alanına sahipse ve propertyDesc.[[Writable]] false ise, o zaman

      1. newArgDesc = propertyDesc'in bir kopyası olarak ayarla.

      2. newArgDesc.[[Value]] = ! Get(map, propertyKey) olarak ayarla.

  5. allowed = ! OrdinaryDefineOwnProperty(args, propertyKey, newArgDesc) olsun.

  6. Eğer allowed false ise, false döndür.

  7. Eğer isMapped true ise, o zaman

    1. Eğer IsAccessorDescriptor(propertyDesc) true ise, o zaman

      1. ! map.[[Delete]](propertyKey) işlemini gerçekleştir.
    2. Değilse,

      1. Eğer propertyDesc bir [[Value]] alanına sahipse, o zaman

         1. [Assert](06_sec-notational-conventions.md#assert): Argüman nesneleri tarafından eşlenen biçimsel parametreler her zaman yazılabilir olduğundan, aşağıdaki Set başarılı olacaktır.
        
         2. ! [Set](08_sec-abstract-operations.md#sec-set-o-p-v-throw)(*map*, *propertyKey*, *propertyDesc*.*[[Value]]*, `false`) işlemini gerçekleştir.
      2. Eğer propertyDesc bir [[Writable]] alanına sahipse ve propertyDesc.[[Writable]] false ise, o zaman

         1. ! *map*.*[[Delete]]*(*propertyKey*) işlemini gerçekleştir.
  8. true döndür.

10.4.4.3 [[Get]] ( propertyKey, receiver )

Bir argüman egzotik nesnesi args'ın [[Get]] iç yöntemi, propertyKey (bir özellik anahtarı) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. map = args.[[ParameterMap]] olsun.

  2. isMapped = ! HasOwnProperty(map, propertyKey) olsun.

  3. Eğer isMapped false ise, ? OrdinaryGet(args, propertyKey, receiver) döndür.

  4. Assert: map, propertyKey için bir biçimsel parametre eşlemesi içerir.

  5. ! Get(map, propertyKey) döndür.

10.4.4.4 [[Set]] ( propertyKey, value, receiver )

Bir argüman egzotik nesnesi args'ın [[Set]] iç yöntemi, propertyKey (bir özellik anahtarı), value (bir ECMAScript dil değeri) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer SameValue(args, receiver) false ise, o zaman

    1. isMapped = false olsun.
  2. Değilse,

    1. map = args.[[ParameterMap]] olsun.

    2. isMapped = ! HasOwnProperty(map, propertyKey) olsun.

  3. Eğer isMapped true ise, o zaman

    1. Assert: Argüman nesneleri tarafından eşlenen biçimsel parametreler her zaman yazılabilir olduğundan, aşağıdaki Set başarılı olacaktır.

    2. ! Set(map, propertyKey, value, false) işlemini gerçekleştir.

  4. ? OrdinarySet(args, propertyKey, value, receiver) döndür.

10.4.4.5 [[Delete]] ( propertyKey )

Bir argüman egzotik nesnesi args'ın [[Delete]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. map = args.[[ParameterMap]] olsun.

  2. isMapped = ! HasOwnProperty(map, propertyKey) olsun.

  3. result = ? OrdinaryDelete(args, propertyKey) olsun.

  4. Eğer result true ise ve isMapped true ise, o zaman

    1. ! map.[[Delete]](propertyKey) işlemini gerçekleştir.
  5. result döndür.

10.4.4.6 CreateUnmappedArgumentsObject ( argList )

Soyut işlem CreateUnmappedArgumentsObject, argList (ECMAScript dil değerlerinden oluşan bir Liste) argümanını alır ve bir sıradan nesne döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. length = argList'teki öğe sayısı olsun.

  2. obj = OrdinaryObjectCreate(%Object.prototype%, « [[ParameterMap]] ») olsun.

  3. obj.[[ParameterMap]] = undefined olarak ayarla.

  4. ! DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) işlemini gerçekleştir.

  5. index = 0 olsun.

  6. index < length olduğu sürece tekrar et,

    1. value = argList[index] olsun.

    2. ! CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), value) işlemini gerçekleştir.

    3. index = index + 1 olarak ayarla.

  7. ! DefinePropertyOrThrow(obj, %Symbol.iterator%, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) işlemini gerçekleştir.

  8. ! DefinePropertyOrThrow(obj, "callee", PropertyDescriptor { [[Get]]: %ThrowTypeError%, [[Set]]: %ThrowTypeError%, [[Enumerable]]: false, [[Configurable]]: false }) işlemini gerçekleştir.

  9. obj döndür.

10.4.4.7 CreateMappedArgumentsObject ( func, formals, argList, envRecord )

Soyut işlem CreateMappedArgumentsObject, func (bir ECMAScript işlev nesnesi), formals (bir Parse Node), argList (ECMAScript dil değerlerinden oluşan bir Liste) ve envRecord (bir Ortam Kaydı) argümanlarını alır ve bir argüman egzotik nesnesi döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: formals, bir rest parametresi, herhangi bir bağlama deseni veya herhangi bir ilklendirici içermez. Yinelenen tanımlayıcılar içerebilir.

  2. length = argList'teki öğe sayısı olsun.

  3. obj = MakeBasicObject[[Prototype]], [[Extensible]], [[ParameterMap]] ») olsun.

  4. obj.[[GetOwnProperty]]'yi 10.4.4.1'de belirtildiği gibi ayarla.

  5. obj.[[DefineOwnProperty]]'yi 10.4.4.2'de belirtildiği gibi ayarla.

  6. obj.[[Get]]'i 10.4.4.3'te belirtildiği gibi ayarla.

  7. obj.[[Set]]'i 10.4.4.4'te belirtildiği gibi ayarla.

  8. obj.[[Delete]]'i 10.4.4.5'te belirtildiği gibi ayarla.

  9. obj.[[Prototype]]%Object.prototype% olarak ayarla.

  10. map = OrdinaryObjectCreate(null) olsun.

  11. obj.[[ParameterMap]]'i map olarak ayarla.

  12. paramNames = formals'ın BoundNames değeri olsun.

  13. paramCount = paramNames'teki öğe sayısı olsun.

  14. index = 0 olsun.

  15. index < length olduğu sürece tekrar et,

    1. value = argList[index] olsun.

    2. ! CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), value) işlemini gerçekleştir.

    3. index = index + 1 olarak ayarla.

  16. ! DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) işlemini gerçekleştir.

  17. mappedNames = yeni bir boş Liste olsun.

  18. index = paramCount - 1 olarak ayarla.

  19. index ≥ 0 olduğu sürece tekrar et,

    1. name = paramNames[index] olsun.

    2. Eğer mappedNames, name'i içermiyorsa, o zaman

      1. name'i mappedNames'e ekle.

      2. Eğer index < length ise, o zaman

         1. *getter* = [MakeArgGetter](#sec-makearggetter)(*name*, *envRecord*) olsun.
        
         2. *setter* = [MakeArgSetter](#sec-makeargsetter)(*name*, *envRecord*) olsun.
        
         3. ! *map*.*[[DefineOwnProperty]]*(! [ToString](08_sec-abstract-operations.md#sec-tostring)([𝔽](06_sec-notational-conventions.md#𝔽)(*index*)), PropertyDescriptor { *[[Set]]*: *setter*, *[[Get]]*: *getter*, *[[Enumerable]]*: `false`, *[[Configurable]]*: `true` }) işlemini gerçekleştir.
    3. index = index - 1 olarak ayarla.

  20. ! DefinePropertyOrThrow(obj, %Symbol.iterator%, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) işlemini gerçekleştir.

  21. ! DefinePropertyOrThrow(obj, "callee", PropertyDescriptor { [[Value]]: func, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) işlemini gerçekleştir.

  22. obj döndür.

10.4.4.7.1 MakeArgGetter ( name, envRecord )

Soyut işlem MakeArgGetter, name (bir String) ve envRecord (bir Ortam Kaydı) argümanlarını alır ve bir işlev nesnesi döndürür. Yürütüldüğünde, envRecord içinde name'e bağlı değeri döndüren yerleşik bir işlev nesnesi oluşturur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. getterClosure, name ve envRecord'u yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren, parametresiz yeni bir Abstract Closure olsun:

    1. NormalCompletion(! envRecord.GetBindingValue(name, false)) döndür.
  2. getter = CreateBuiltinFunction(getterClosure, 0, "", « ») olsun.

  3. NOTE: getter, ECMAScript kodu tarafından asla doğrudan erişilebilir değildir.

  4. getter döndür.

10.4.4.7.2 MakeArgSetter ( name, envRecord )

Soyut işlem MakeArgSetter, name (bir String) ve envRecord (bir Ortam Kaydı) argümanlarını alır ve bir işlev nesnesi döndürür. Yürütüldüğünde, envRecord içinde name'e bağlı değeri ayarlayan yerleşik bir işlev nesnesi oluşturur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. setterClosure, (value) parametresine sahip, name ve envRecord'u yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Abstract Closure olsun:

    1. NormalCompletion(! envRecord.SetMutableBinding(name, value, false)) döndür.
  2. setter = CreateBuiltinFunction(setterClosure, 1, "", « ») olsun.

  3. NOTE: setter, ECMAScript kodu tarafından asla doğrudan erişilebilir değildir.

  4. setter döndür.

10.4.5 TypedArray Egzotik Nesneleri

Bir TypedArray, tek tip öğeleri indekslemek için sınırlar içindeki tamsayı indislerinin alt kümesini kullanarak kanonik sayısal dizgiler olan özellik anahtarlarına özel işlem uygulayan ve kalanların prototip zinciri dolaşımına yol açmaksızın mevcut olmaması değişmezini zorunlu kılan bir egzotik nesnedir.

TypedArrays, sıradan nesnelerle aynı iç yuvalara ve ek olarak [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]] ve [[ArrayLength]] iç yuvalarına sahiptir.

Bir nesne, eğer [[PreventExtensions]], [[GetOwnProperty]], [[HasProperty]], [[DefineOwnProperty]], [[Get]], [[Set]], [[Delete]] ve [[OwnPropertyKeys]] iç yöntemleri bu bölümdeki tanımları kullanıyorsa ve diğer temel iç yöntemleri 10.1'de bulunan tanımları kullanıyorsa, bir TypedArray'dir. Bu yöntemler TypedArrayCreate tarafından kurulur.

10.4.5.1 [[PreventExtensions]] ( )

Bir TypedArray obj'nin [[PreventExtensions]] iç yöntemi hiçbir argüman almaz ve bir Boolean içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. NOTE: 6.1.7.3'te belirtilen genişletilebilirlikle ilgili değişmezler, obj, altındaki arabellek yeniden boyutlandırıldığında tamsayı indisli adlara sahip özellikler için meydana gelebilecek şekilde özellik kazanabildiğinde (veya kaybedip sonra yeniden kazanabildiğinde) bu yöntemin true döndürmesine izin vermez.

  2. Eğer IsTypedArrayFixedLength(obj) false ise, false döndür.

  3. OrdinaryPreventExtensions(obj) döndür.

10.4.5.2 [[GetOwnProperty]] ( propertyKey )

Bir TypedArray obj'nin [[GetOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Property Descriptor ya da undefined içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir String ise, o zaman

    1. numericIndex = CanonicalNumericIndexString(propertyKey) olsun.

    2. Eğer numericIndex undefined değilse, o zaman

      1. value = TypedArrayGetElement(obj, numericIndex) olsun.

      2. Eğer value undefined ise, undefined döndür.

      3. PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } döndür.

  2. OrdinaryGetOwnProperty(obj, propertyKey) döndür.

10.4.5.3 [[HasProperty]] ( propertyKey )

Bir TypedArray obj'nin [[HasProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir String ise, o zaman

    1. numericIndex = CanonicalNumericIndexString(propertyKey) olsun.

    2. Eğer numericIndex undefined değilse, IsValidIntegerIndex(obj, numericIndex) döndür.

  2. ? OrdinaryHasProperty(obj, propertyKey) döndür.

10.4.5.4 [[DefineOwnProperty]] ( propertyKey, propertyDesc )

Bir TypedArray obj'nin [[DefineOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) ve propertyDesc (bir Property Descriptor) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir String ise, o zaman

    1. numericIndex = CanonicalNumericIndexString(propertyKey) olsun.

    2. Eğer numericIndex undefined değilse, o zaman

      1. Eğer IsValidIntegerIndex(obj, numericIndex) false ise, false döndür.

      2. Eğer propertyDesc bir [[Configurable]] alanına sahipse ve propertyDesc.[[Configurable]] false ise, false döndür.

      3. Eğer propertyDesc bir [[Enumerable]] alanına sahipse ve propertyDesc.[[Enumerable]] false ise, false döndür.

      4. Eğer IsAccessorDescriptor(propertyDesc) true ise, false döndür.

      5. Eğer propertyDesc bir [[Writable]] alanına sahipse ve propertyDesc.[[Writable]] false ise, false döndür.

      6. Eğer propertyDesc bir [[Value]] alanına sahipse, ? TypedArraySetElement(obj, numericIndex, propertyDesc.[[Value]]) işlemini gerçekleştir.

      7. true döndür.

  2. ! OrdinaryDefineOwnProperty(obj, propertyKey, propertyDesc) döndür.

10.4.5.5 [[Get]] ( propertyKey, receiver )

Bir TypedArray obj'nin [[Get]] iç yöntemi, propertyKey (bir özellik anahtarı) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir String ise, o zaman

    1. numericIndex = CanonicalNumericIndexString(propertyKey) olsun.

    2. Eğer numericIndex undefined değilse, o zaman

      1. TypedArrayGetElement(obj, numericIndex) döndür.
  2. ? OrdinaryGet(obj, propertyKey, receiver) döndür.

10.4.5.6 [[Set]] ( propertyKey, value, receiver )

Bir TypedArray obj'nin [[Set]] iç yöntemi, propertyKey (bir özellik anahtarı), value (bir ECMAScript dil değeri) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir String ise, o zaman

    1. numericIndex = CanonicalNumericIndexString(propertyKey) olsun.

    2. Eğer numericIndex undefined değilse, o zaman

      1. Eğer SameValue(obj, receiver) true ise, o zaman

         1. ? [TypedArraySetElement](#sec-typedarraysetelement)(*obj*, *numericIndex*, *value*) işlemini gerçekleştir.
        
         2. `true` döndür.
      2. Eğer IsValidIntegerIndex(obj, numericIndex) false ise, true döndür.

  2. ? OrdinarySet(obj, propertyKey, value, receiver) döndür.

10.4.5.7 [[Delete]] ( propertyKey )

Bir TypedArray obj'nin [[Delete]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve bir Boolean içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir String ise, o zaman

    1. numericIndex = CanonicalNumericIndexString(propertyKey) olsun.

    2. Eğer numericIndex undefined değilse, o zaman

      1. Eğer IsValidIntegerIndex(obj, numericIndex) false ise, true döndür.

      2. false döndür.

  2. ! OrdinaryDelete(obj, propertyKey) döndür.

10.4.5.8 [[OwnPropertyKeys]] ( )

Bir TypedArray obj'nin [[OwnPropertyKeys]] iç yöntemi hiçbir argüman almaz ve özellik anahtarlarından oluşan bir Liste içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. taRecord = MakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) olsun.

  2. keys = yeni bir boş Liste olsun.

  3. Eğer IsTypedArrayOutOfBounds(taRecord) false ise, o zaman

    1. length = TypedArrayLength(taRecord) olsun.

    2. 0 ≤ i < length olacak şekildeki her tamsayı i için, artan sırada,

      1. ! ToString(𝔽(i)) değerini keys'e ekle.
  4. obj'nin, propertyKey bir String olan ve bir tamsayı indisi olmayan her kendi özellik anahtarı propertyKey için, özellik oluşturmanın artan kronolojik sırasında,

    1. propertyKey'i keys'e ekle.
  5. obj'nin, propertyKey bir Symbol olan her kendi özellik anahtarı propertyKey için, özellik oluşturmanın artan kronolojik sırasında,

    1. propertyKey'i keys'e ekle.
  6. keys döndür.

10.4.5.9 TypedArray With Buffer Witness Kayıtları

Bir TypedArray With Buffer Witness Record, görüntülenen arabelleğin önbelleğe alınmış bayt uzunluğu ile birlikte bir TypedArray'i kapsüllemek için kullanılan bir Record değeridir. Görüntülenen arabellek bir büyütülebilir SharedArrayBuffer olduğunda, bayt uzunluğu veri bloğunun tek bir ReadSharedMemory olayı olmasını sağlamaya yardımcı olmak için kullanılır.

TypedArray With Buffer Witness Kayıtları, Tablo 27'de listelenen alanlara sahiptir.

Tablo 27: TypedArray With Buffer Witness Record Alanları

Alan Adı Değer Anlamı
[[Object]] bir TypedArray Arabelleğinin bayt uzunluğu yüklenen TypedArray.
[[CachedBufferByteLength]] negatif olmayan bir tamsayı veya detached Record oluşturulduğunda nesnenin [[ViewedArrayBuffer]]'ının bayt uzunluğu.

10.4.5.10 MakeTypedArrayWithBufferWitnessRecord ( obj, order )

Soyut işlem MakeTypedArrayWithBufferWitnessRecord, obj (bir TypedArray) ve order (seq-cst veya unordered) argümanlarını alır ve bir TypedArray With Buffer Witness Record döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. buffer = obj.[[ViewedArrayBuffer]] olsun.

  2. Eğer IsDetachedBuffer(buffer) true ise, o zaman

    1. byteLength = detached olsun.
  3. Değilse,

    1. byteLength = ArrayBufferByteLength(buffer, order) olsun.
  4. TypedArray With Buffer Witness Record { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength } döndür.

10.4.5.11 TypedArrayCreate ( proto )

Soyut işlem TypedArrayCreate, proto (bir Object) argümanını alır ve bir TypedArray döndürür. Yeni TypedArrays oluşturulmasını belirtmek için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. internalSlotsList = « [[Prototype]], [[Extensible]], [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] » olsun.

  2. ta = MakeBasicObject(internalSlotsList) olsun.

  3. ta.[[PreventExtensions]]'i 10.4.5.1'de belirtildiği gibi ayarla.

  4. ta.[[GetOwnProperty]]'yi 10.4.5.2'de belirtildiği gibi ayarla.

  5. ta.[[HasProperty]]'yi 10.4.5.3'te belirtildiği gibi ayarla.

  6. ta.[[DefineOwnProperty]]'yi 10.4.5.4'te belirtildiği gibi ayarla.

  7. ta.[[Get]]'i 10.4.5.5'te belirtildiği gibi ayarla.

  8. ta.[[Set]]'i 10.4.5.6'da belirtildiği gibi ayarla.

  9. ta.[[Delete]]'i 10.4.5.7'de belirtildiği gibi ayarla.

  10. ta.[[OwnPropertyKeys]]'i 10.4.5.8'de belirtildiği gibi ayarla.

  11. ta.[[Prototype]]proto olarak ayarla.

  12. ta döndür.

10.4.5.12 TypedArrayByteLength ( taRecord )

Soyut işlem TypedArrayByteLength, taRecord (bir TypedArray With Buffer Witness Record) argümanını alır ve negatif olmayan bir tamsayı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsTypedArrayOutOfBounds(taRecord) false'dır.

  2. obj = taRecord.[[Object]] olsun.

  3. Eğer obj.[[ByteLength]] auto değilse, obj.[[ByteLength]] döndür.

  4. length = TypedArrayLength(taRecord) olsun.

  5. elementSize = TypedArrayElementSize(obj) olsun.

  6. NOTE: Döndürülen bayt uzunluğu, altındaki arabellek tamsayı olmayan bir katına yeniden boyutlandırılmış olsa bile, her zaman elementSize'ın bir tamsayı katıdır.

  7. length × elementSize döndür.

10.4.5.13 TypedArrayLength ( taRecord )

Soyut işlem TypedArrayLength, taRecord (bir TypedArray With Buffer Witness Record) argümanını alır ve negatif olmayan bir tamsayı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsTypedArrayOutOfBounds(taRecord) false'dır.

  2. obj = taRecord.[[Object]] olsun.

  3. Eğer obj.[[ArrayLength]] auto değilse, obj.[[ArrayLength]] döndür.

  4. Assert: IsFixedLengthArrayBuffer(obj.[[ViewedArrayBuffer]]) false'dır.

  5. byteOffset = obj.[[ByteOffset]] olsun.

  6. elementSize = TypedArrayElementSize(obj) olsun.

  7. byteLength = taRecord.[[CachedBufferByteLength]] olsun.

  8. Assert: byteLength detached değildir.

  9. floor((byteLength - byteOffset) / elementSize) döndür.

10.4.5.14 IsTypedArrayOutOfBounds ( taRecord )

Soyut işlem IsTypedArrayOutOfBounds, taRecord (bir TypedArray With Buffer Witness Record) argümanını alır ve bir Boolean döndürür. Nesnenin sayısal özelliklerinden herhangi birinin, altındaki arabelleğin sınırları içinde yer almayan bir indisteki bir değere başvurup başvurmadığını denetler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj = taRecord.[[Object]] olsun.

  2. bufferByteLength = taRecord.[[CachedBufferByteLength]] olsun.

  3. Eğer IsDetachedBuffer(obj.[[ViewedArrayBuffer]]) true ise, o zaman

    1. Assert: bufferByteLength detached'dir.

    2. true döndür.

  4. Assert: bufferByteLength negatif olmayan bir tamsayıdır.

  5. byteOffsetStart = obj.[[ByteOffset]] olsun.

  6. Eğer obj.[[ArrayLength]] auto ise, o zaman

    1. byteOffsetEnd = bufferByteLength olsun.
  7. Değilse,

    1. elementSize = TypedArrayElementSize(obj) olsun.

    2. arrayByteLength = obj.[[ArrayLength]] × elementSize olsun.

    3. byteOffsetEnd = byteOffsetStart + arrayByteLength olsun.

  8. NOTE: [[ByteOffset]]bufferByteLength olan 0 uzunluklu bir TypedArray sınır dışında kabul edilmez.

  9. Eğer byteOffsetStart > bufferByteLength veya byteOffsetEnd > bufferByteLength ise, true döndür.

  10. false döndür.

10.4.5.15 IsTypedArrayFixedLength ( obj )

Soyut işlem IsTypedArrayFixedLength, obj (bir TypedArray) argümanını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer obj.[[ArrayLength]] auto ise, false döndür.

  2. buffer = obj.[[ViewedArrayBuffer]] olsun.

  3. Eğer IsFixedLengthArrayBuffer(buffer) false ve IsSharedArrayBuffer(buffer) false ise, false döndür.

  4. true döndür.

10.4.5.16 IsValidIntegerIndex ( obj, index )

Soyut işlem IsValidIntegerIndex, obj (bir TypedArray) ve index (bir Number) argümanlarını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer IsDetachedBuffer(obj.[[ViewedArrayBuffer]]) true ise, false döndür.

  2. Eğer index bir tam sayı Number değilse, false döndür.

  3. Eğer index -0𝔽 veya index < -0𝔽 ise, false döndür.

  4. taRecord = MakeTypedArrayWithBufferWitnessRecord(obj, unordered) olsun.

  5. NOTE: obj'nin destek arabelleği bir büyütülebilir SharedArrayBuffer olduğunda, sınır denetimi senkronize edici bir işlem değildir.

  6. Eğer IsTypedArrayOutOfBounds(taRecord) true ise, false döndür.

  7. length = TypedArrayLength(taRecord) olsun.

  8. Eğer (index) ≥ length ise, false döndür.

  9. true döndür.

10.4.5.17 TypedArrayGetElement ( obj, index )

Soyut işlem TypedArrayGetElement, obj (bir TypedArray) ve index (bir Number) argümanlarını alır ve bir Number, bir BigInt veya undefined döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer IsValidIntegerIndex(obj, index) false ise, undefined döndür.

  2. offset = obj.[[ByteOffset]] olsun.

  3. elementSize = TypedArrayElementSize(obj) olsun.

  4. byteIndexInBuffer = ((index) × elementSize) + offset olsun.

  5. elementType = TypedArrayElementType(obj) olsun.

  6. GetValueFromBuffer(obj.[[ViewedArrayBuffer]], byteIndexInBuffer, elementType, true, unordered) döndür.

10.4.5.18 TypedArraySetElement ( obj, index, value )

Soyut işlem TypedArraySetElement, obj (bir TypedArray), index (bir Number) ve value (bir ECMAScript dil değeri) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer obj.[[ContentType]] bigint ise, number = ? ToBigInt(value) olsun.

  2. Değilse, number = ? ToNumber(value) olsun.

  3. Eğer IsValidIntegerIndex(obj, index) true ise, o zaman

    1. offset = obj.[[ByteOffset]] olsun.

    2. elementSize = TypedArrayElementSize(obj) olsun.

    3. byteIndexInBuffer = ((index) × elementSize) + offset olsun.

    4. elementType = TypedArrayElementType(obj) olsun.

    5. SetValueInBuffer(obj.[[ViewedArrayBuffer]], byteIndexInBuffer, elementType, number, true, unordered) işlemini gerçekleştir.

  4. unused döndür.

10.4.5.19 IsArrayBufferViewOutOfBounds ( obj )

Soyut işlem IsArrayBufferViewOutOfBounds, obj (bir TypedArray veya bir DataView) argümanını alır ve bir Boolean döndürür. Bir TypedArray'in sayısal özelliklerinden herhangi birinin veya bir DataView nesnesinin yöntemlerinin, altındaki veri bloğunun sınırları içinde yer almayan bir indisteki bir değere başvurup başvuramayacağını denetler. Bu soyut işlem, üst belirtimler için bir kolaylık olarak mevcuttur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer obj bir [[DataView]] iç yuvasına sahipse, o zaman

    1. viewRecord = MakeDataViewWithBufferWitnessRecord(obj, seq-cst) olsun.

    2. IsViewOutOfBounds(viewRecord) döndür.

  2. taRecord = MakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) olsun.

  3. IsTypedArrayOutOfBounds(taRecord) döndür.

10.4.6 Modül Ad Alanı Egzotik Nesneleri

Bir modül ad alanı egzotik nesnesi, bir ECMAScript Module tarafından dışa aktarılan bağlamaları açığa çıkaran bir egzotik nesnedir (Bkz. 16.2.3). Bir modül ad alanı egzotik nesnesinin String anahtarlı kendi özellikleri ile Module tarafından dışa aktarılan bağlama adları arasında bire bir bir karşılık vardır. Dışa aktarılan bağlamalar, export * dışa aktarma öğeleri kullanılarak dolaylı olarak dışa aktarılan tüm bağlamaları içerir. Her String değerli kendi özellik anahtarı, karşılık gelen dışa aktarılan bağlama adının StringValue değeridir. Bunlar, bir modül ad alanı egzotik nesnesinin yegane String anahtarlı özellikleridir. Bu tür her özellik şu niteliklere sahiptir: { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false }. Modül ad alanı egzotik nesneleri genişletilebilir değildir.

Bir nesne, eğer [[GetPrototypeOf]], [[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]], [[GetOwnProperty]], [[DefineOwnProperty]], [[HasProperty]], [[Get]], [[Set]], [[Delete]] ve [[OwnPropertyKeys]] iç yöntemleri bu bölümdeki tanımları kullanıyorsa ve diğer temel iç yöntemleri 10.1'de bulunan tanımları kullanıyorsa, bir modül ad alanı egzotik nesnesidir. Bu yöntemler ModuleNamespaceCreate tarafından kurulur.

Modül ad alanı egzotik nesneleri, Tablo 28'de tanımlanan iç yuvalara sahiptir.

Tablo 28: Modül Ad Alanı Egzotik Nesnelerinin İç Yuvaları

İç Yuva Tür Açıklama
[[Module]] bir Module Record Bu ad alanının dışa aktarımlarını açığa çıkardığı Module Record.
[[Exports]] String'lerden oluşan bir Liste Öğeleri, bu nesnenin kendi özellikleri olarak açığa çıkarılan dışa aktarılan adların String değerleri olan bir Liste. Liste, sözcüksel kod birimi sırasına göre sıralanmıştır.

10.4.6.1 [[GetPrototypeOf]] ( )

Bir modül ad alanı egzotik nesnesinin [[GetPrototypeOf]] iç yöntemi hiçbir argüman almaz ve null içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. null döndür.

10.4.6.2 [[SetPrototypeOf]] ( proto )

Bir modül ad alanı egzotik nesnesi obj'nin [[SetPrototypeOf]] iç yöntemi, proto (bir Object veya null) argümanını alır ve bir Boolean içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ! SetImmutablePrototype(obj, proto) döndür.

10.4.6.3 [[IsExtensible]] ( )

Bir modül ad alanı egzotik nesnesinin [[IsExtensible]] iç yöntemi hiçbir argüman almaz ve false içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. false döndür.

10.4.6.4 [[PreventExtensions]] ( )

Bir modül ad alanı egzotik nesnesinin [[PreventExtensions]] iç yöntemi hiçbir argüman almaz ve true içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. true döndür.

10.4.6.5 [[GetOwnProperty]] ( propertyKey )

Bir modül ad alanı egzotik nesnesi obj'nin [[GetOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Property Descriptor veya undefined içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir Symbol ise, OrdinaryGetOwnProperty(obj, propertyKey) döndür.

  2. exports = obj.[[Exports]] olsun.

  3. Eğer exports, propertyKey'i içermiyorsa, undefined döndür.

  4. value = ? obj.[[Get]](propertyKey, obj) olsun.

  5. PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false } döndür.

10.4.6.6 [[DefineOwnProperty]] ( propertyKey, propertyDesc )

Bir modül ad alanı egzotik nesnesi obj'nin [[DefineOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) ve propertyDesc (bir Property Descriptor) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir Symbol ise, ! OrdinaryDefineOwnProperty(obj, propertyKey, propertyDesc) döndür.

  2. current = ? obj.[[GetOwnProperty]](propertyKey) olsun.

  3. Eğer current undefined ise, false döndür.

  4. Eğer propertyDesc bir [[Configurable]] alanına sahipse ve propertyDesc.[[Configurable]] true ise, false döndür.

  5. Eğer propertyDesc bir [[Enumerable]] alanına sahipse ve propertyDesc.[[Enumerable]] false ise, false döndür.

  6. Eğer IsAccessorDescriptor(propertyDesc) true ise, false döndür.

  7. Eğer propertyDesc bir [[Writable]] alanına sahipse ve propertyDesc.[[Writable]] false ise, false döndür.

  8. Eğer propertyDesc bir [[Value]] alanına sahipse, SameValue(propertyDesc.[[Value]], current.[[Value]]) döndür.

  9. true döndür.

10.4.6.7 [[HasProperty]] ( propertyKey )

Bir modül ad alanı egzotik nesnesi obj'nin [[HasProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve bir Boolean içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir Symbol ise, ! OrdinaryHasProperty(obj, propertyKey) döndür.

  2. exports = obj.[[Exports]] olsun.

  3. Eğer exports, propertyKey'i içeriyorsa, true döndür.

  4. false döndür.

10.4.6.8 [[Get]] ( propertyKey, receiver )

Bir modül ad alanı egzotik nesnesi obj'nin [[Get]] iç yöntemi, propertyKey (bir özellik anahtarı) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir Symbol ise, o zaman

    1. ! OrdinaryGet(obj, propertyKey, receiver) döndür.
  2. exports = obj.[[Exports]] olsun.

  3. Eğer exports, propertyKey'i içermiyorsa, undefined döndür.

  4. module = obj.[[Module]] olsun.

  5. binding = module.ResolveExport(propertyKey) olsun.

  6. Assert: binding bir ResolvedBinding Record'dır.

  7. targetModule = binding.[[Module]] olsun.

  8. Assert: targetModule undefined değildir.

  9. Eğer binding.[[BindingName]] namespace ise, o zaman

    1. GetModuleNamespace(targetModule) döndür.
  10. targetEnv = targetModule.[[Environment]] olsun.

  11. Eğer targetEnv empty ise, bir ReferenceError kuraldışı durumu fırlat.

  12. ? targetEnv.GetBindingValue(binding.[[BindingName]], true) döndür.

10.4.6.9 [[Set]] ( propertyKey, value, receiver )

Bir modül ad alanı egzotik nesnesinin [[Set]] iç yöntemi, propertyKey (bir özellik anahtarı), value (bir ECMAScript dil değeri) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve false içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. false döndür.

10.4.6.10 [[Delete]] ( propertyKey )

Bir modül ad alanı egzotik nesnesi obj'nin [[Delete]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve bir Boolean içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyKey bir Symbol ise, o zaman

    1. ! OrdinaryDelete(obj, propertyKey) döndür.
  2. exports = obj.[[Exports]] olsun.

  3. Eğer exports, propertyKey'i içeriyorsa, false döndür.

  4. true döndür.

10.4.6.11 [[OwnPropertyKeys]] ( )

Bir modül ad alanı egzotik nesnesi obj'nin [[OwnPropertyKeys]] iç yöntemi hiçbir argüman almaz ve özellik anahtarlarından oluşan bir Liste içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. exports = obj.[[Exports]] olsun.

  2. symbolKeys = OrdinaryOwnPropertyKeys(obj) olsun.

  3. exports ile symbolKeys'in liste birleştirmesini döndür.

10.4.6.12 ModuleNamespaceCreate ( module, exports )

Soyut işlem ModuleNamespaceCreate, module (bir Module Record) ve exports (String'lerden oluşan bir Liste) argümanlarını alır ve bir modül ad alanı egzotik nesnesi döndürür. Yeni modül ad alanı egzotik nesnelerinin oluşturulmasını belirtmek için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: module.[[Namespace]] empty'dir.

  2. internalSlotsList, Tablo 28'de listelenen iç yuvalar olsun.

  3. namespace = MakeBasicObject(internalSlotsList) olsun.

  4. namespace'in temel iç yöntemlerini 10.4.6'da belirtilen tanımlara ayarla.

  5. namespace.[[Module]]module olarak ayarla.

  6. sortedExports, öğeleri exports'ın öğeleri olan ve sözcüksel kod birimi sırasına göre sıralanmış bir Liste olsun.

  7. namespace.[[Exports]]'u sortedExports olarak ayarla.

  8. namespace'in 28.3'teki tanımlara karşılık gelen kendi özelliklerini oluştur.

  9. module.[[Namespace]]'i namespace olarak ayarla.

  10. namespace döndür.

10.4.7 Değişmez Prototip Egzotik Nesneleri

Bir değişmez prototip egzotik nesnesi, bir kez ilklendirildikten sonra değişmeyecek bir [[Prototype]] iç yuvasına sahip olan bir egzotik nesnedir.

Bir nesne, eğer [[SetPrototypeOf]] iç yöntemi aşağıdaki gerçekleştirimi kullanıyorsa, bir değişmez prototip egzotik nesnesidir. (Diğer temel iç yöntemleri, söz konusu belirli değişmez prototip egzotik nesnesine bağlı olarak herhangi bir gerçekleştirimi kullanabilir.)

10.4.7.1 [[SetPrototypeOf]] ( proto )

Bir değişmez prototip egzotik nesnesi obj'nin [[SetPrototypeOf]] iç yöntemi, proto (bir Object veya null) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? SetImmutablePrototype(obj, proto) döndür.

10.4.7.2 SetImmutablePrototype ( obj, proto )

Soyut işlem SetImmutablePrototype, obj (bir Object) ve proto (bir Object veya null) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. current = ? obj.[[GetPrototypeOf]]() olsun.

  2. Eğer SameValue(proto, current) true ise, true döndür.

  3. false döndür.

10.5 Proxy Nesnesi İç Yöntemleri ve İç Yuvaları

Bir Proxy nesnesi, temel iç yöntemleri kısmen ECMAScript kodu kullanılarak gerçekleştirilen bir egzotik nesnedir. Her Proxy nesnesi, [[ProxyHandler]] adlı bir iç yuvaya sahiptir. [[ProxyHandler]]'ın değeri, proxy'nin işleyici nesnesi olarak adlandırılan bir nesne veya null'dır. Bir işleyici nesnesinin yöntemleri (bkz. Tablo 29), Proxy nesnesinin bir veya daha fazla iç yönteminin gerçekleştirimini desteklemek için kullanılabilir. Her Proxy nesnesi ayrıca, değeri bir nesne veya null olan [[ProxyTarget]] adlı bir iç yuvaya sahiptir. Bu nesne, proxy'nin hedef nesnesi olarak adlandırılır.

Bir nesne, eğer temel iç yöntemleri (varsa [[Call]] ve [[Construct]] dahil) bu bölümdeki tanımları kullanıyorsa, bir Proxy egzotik nesnesidir. Bu iç yöntemler ProxyCreate içinde kurulur.

Tablo 29: Proxy İşleyici Yöntemleri

İç Yöntem İşleyici Yöntemi
[[GetPrototypeOf]] getPrototypeOf
[[SetPrototypeOf]] setPrototypeOf
[[IsExtensible]] isExtensible
[[PreventExtensions]] preventExtensions
[[GetOwnProperty]] getOwnPropertyDescriptor
[[DefineOwnProperty]] defineProperty
[[HasProperty]] has
[[Get]] get
[[Set]] set
[[Delete]] deleteProperty
[[OwnPropertyKeys]] ownKeys
[[Call]] apply
[[Construct]] construct

Bir Proxy nesnesi iç yönteminin gerçekleştirimini sağlamak üzere bir işleyici yöntemi çağrıldığında, işleyici yöntemine parametre olarak proxy'nin hedef nesnesi geçirilir. Bir proxy'nin işleyici nesnesi, her temel iç yönteme karşılık gelen bir yönteme mutlaka sahip değildir. İşleyici nesnesi, iç tuzağa karşılık gelen bir yönteme sahip değilse, proxy üzerinde bir iç yöntemin çağrılması, proxy'nin hedef nesnesi üzerinde karşılık gelen iç yöntemin çağrılmasıyla sonuçlanır.

Bir Proxy nesnesinin [[ProxyHandler]] ve [[ProxyTarget]] iç yuvaları, nesne oluşturulduğunda her zaman ilklendirilir ve tipik olarak değiştirilemez. Bazı Proxy nesneleri, daha sonra iptal edilmelerine izin verecek şekilde oluşturulur. Bir proxy iptal edildiğinde, [[ProxyHandler]] ve [[ProxyTarget]] iç yuvaları null olarak ayarlanır ve bu, o Proxy nesnesi üzerindeki iç yöntemlerin sonraki çağrılışlarının bir TypeError kuraldışı durumu fırlatmasına neden olur.

Proxy nesneleri, iç yöntemlerin gerçekleştiriminin keyfi ECMAScript kodu tarafından sağlanmasına izin verdiğinden, işleyici yöntemleri 6.1.7.3'te tanımlanan değişmezleri ihlal eden bir Proxy nesnesi tanımlamak mümkündür. 6.1.7.3'te tanımlanan iç yöntem değişmezlerinden bazıları temel bütünlük değişmezleridir. Bu değişmezler, bu bölümde belirtilen Proxy nesnesi iç yöntemleri tarafından açıkça zorlanır. Bir ECMAScript gerçekleştirimi, tüm olası değişmez ihlalleri karşısında sağlam olmalıdır.

Aşağıdaki algoritma açıklamalarında, obj'nin bir ECMAScript Proxy nesnesi olduğunu, propertyKey'in bir özellik anahtarı değeri olduğunu, value'nun herhangi bir ECMAScript dil değeri olduğunu ve propertyDesc'in bir Property Descriptor kaydı olduğunu varsayın.

10.5.1 [[GetPrototypeOf]] ( )

Bir Proxy egzotik nesnesi obj'nin [[GetPrototypeOf]] iç yöntemi hiçbir argüman almaz ve ya bir Object veya null içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "getPrototypeOf") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? target.[[GetPrototypeOf]]() döndür.
  7. handlerProto = ? Call(trap, handler, « target ») olsun.

  8. Eğer handlerProto bir Object değilse ve handlerProto null değilse, bir TypeError kuraldışı durumu fırlat.

  9. extensibleTarget = ? IsExtensible(target) olsun.

  10. Eğer extensibleTarget true ise, handlerProto döndür.

  11. targetProto = ? target.[[GetPrototypeOf]]() olsun.

  12. Eğer SameValue(handlerProto, targetProto) false ise, bir TypeError kuraldışı durumu fırlat.

  13. handlerProto döndür.

10.5.2 [[SetPrototypeOf]] ( proto )

Bir Proxy egzotik nesnesi obj'nin [[SetPrototypeOf]] iç yöntemi, proto (bir Object veya null) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "setPrototypeOf") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? target.[[SetPrototypeOf]](proto) döndür.
  7. boolTrapResult = ToBoolean(? Call(trap, handler, « target, proto »)) olsun.

  8. Eğer boolTrapResult false ise, false döndür.

  9. extensibleTarget = ? IsExtensible(target) olsun.

  10. Eğer extensibleTarget true ise, true döndür.

  11. targetProto = ? target.[[GetPrototypeOf]]() olsun.

  12. Eğer SameValue(proto, targetProto) false ise, bir TypeError kuraldışı durumu fırlat.

  13. true döndür.

10.5.3 [[IsExtensible]] ( )

Bir Proxy egzotik nesnesi obj'nin [[IsExtensible]] iç yöntemi hiçbir argüman almaz ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "isExtensible") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? IsExtensible(target) döndür.
  7. boolTrapResult = ToBoolean(? Call(trap, handler, « target »)) olsun.

  8. targetResult = ? IsExtensible(target) olsun.

  9. Eğer boolTrapResult, targetResult değilse, bir TypeError kuraldışı durumu fırlat.

  10. boolTrapResult döndür.

10.5.4 [[PreventExtensions]] ( )

Bir Proxy egzotik nesnesi obj'nin [[PreventExtensions]] iç yöntemi hiçbir argüman almaz ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "preventExtensions") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? target.[[PreventExtensions]]() döndür.
  7. boolTrapResult = ToBoolean(? Call(trap, handler, « target »)) olsun.

  8. Eğer boolTrapResult true ise, o zaman

    1. extensibleTarget = ? IsExtensible(target) olsun.

    2. Eğer extensibleTarget true ise, bir TypeError kuraldışı durumu fırlat.

  9. boolTrapResult döndür.

10.5.5 [[GetOwnProperty]] ( propertyKey )

Bir Proxy egzotik nesnesi obj'nin [[GetOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Property Descriptor veya undefined içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "getOwnPropertyDescriptor") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? target.[[GetOwnProperty]](propertyKey) döndür.
  7. trapResultObj = ? Call(trap, handler, « target, propertyKey ») olsun.

  8. Eğer trapResultObj bir Object değilse ve trapResultObj undefined değilse, bir TypeError kuraldışı durumu fırlat.

  9. targetDesc = ? target.[[GetOwnProperty]](propertyKey) olsun.

  10. Eğer trapResultObj undefined ise, o zaman

    1. Eğer targetDesc undefined ise, undefined döndür.

    2. Eğer targetDesc.[[Configurable]] false ise, bir TypeError kuraldışı durumu fırlat.

    3. extensibleTarget = ? IsExtensible(target) olsun.

    4. Eğer extensibleTarget false ise, bir TypeError kuraldışı durumu fırlat.

    5. undefined döndür.

  11. extensibleTarget = ? IsExtensible(target) olsun.

  12. resultDesc = ? ToPropertyDescriptor(trapResultObj) olsun.

  13. CompletePropertyDescriptor(resultDesc) işlemini gerçekleştir.

  14. valid = IsCompatiblePropertyDescriptor(extensibleTarget, resultDesc, targetDesc) olsun.

  15. Eğer valid false ise, bir TypeError kuraldışı durumu fırlat.

  16. Eğer resultDesc.[[Configurable]] false ise, o zaman

    1. Eğer targetDesc undefined ise veya targetDesc.[[Configurable]] true ise, o zaman

      1. Bir TypeError kuraldışı durumu fırlat.
    2. Eğer resultDesc bir [[Writable]] alanına sahipse ve resultDesc.[[Writable]] false ise, o zaman

      1. Assert: targetDesc bir [[Writable]] alanına sahiptir.

      2. Eğer targetDesc.[[Writable]] true ise, bir TypeError kuraldışı durumu fırlat.

  17. resultDesc döndür.

10.5.6 [[DefineOwnProperty]] ( propertyKey, propertyDesc )

Bir Proxy egzotik nesnesi obj'nin [[DefineOwnProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) ve propertyDesc (bir Property Descriptor) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "defineProperty") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? target.[[DefineOwnProperty]](propertyKey, propertyDesc) döndür.
  7. propertyDescObj = FromPropertyDescriptor(propertyDesc) olsun.

  8. boolTrapResult = ToBoolean(? Call(trap, handler, « target, propertyKey, propertyDescObj »)) olsun.

  9. Eğer boolTrapResult false ise, false döndür.

  10. targetDesc = ? target.[[GetOwnProperty]](propertyKey) olsun.

  11. extensibleTarget = ? IsExtensible(target) olsun.

  12. Eğer propertyDesc bir [[Configurable]] alanına sahipse ve propertyDesc.[[Configurable]] false ise, o zaman

    1. settingConfigFalse = true olsun.
  13. Değilse,

    1. settingConfigFalse = false olsun.
  14. Eğer targetDesc undefined ise, o zaman

    1. Eğer extensibleTarget false ise, bir TypeError kuraldışı durumu fırlat.

    2. Eğer settingConfigFalse true ise, bir TypeError kuraldışı durumu fırlat.

  15. Değilse,

    1. Eğer IsCompatiblePropertyDescriptor(extensibleTarget, propertyDesc, targetDesc) false ise, bir TypeError kuraldışı durumu fırlat.

    2. Eğer settingConfigFalse true ise ve targetDesc.[[Configurable]] true ise, bir TypeError kuraldışı durumu fırlat.

    3. Eğer IsDataDescriptor(targetDesc) true ise, targetDesc.[[Configurable]] false ise ve targetDesc.[[Writable]] true ise, o zaman

      1. Eğer propertyDesc bir [[Writable]] alanına sahipse ve propertyDesc.[[Writable]] false ise, bir TypeError kuraldışı durumu fırlat.
  16. true döndür.

10.5.7 [[HasProperty]] ( propertyKey )

Bir Proxy egzotik nesnesi obj'nin [[HasProperty]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "has") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? target.[[HasProperty]](propertyKey) döndür.
  7. boolTrapResult = ToBoolean(? Call(trap, handler, « target, propertyKey »)) olsun.

  8. Eğer boolTrapResult false ise, o zaman

    1. targetDesc = ? target.[[GetOwnProperty]](propertyKey) olsun.

    2. Eğer targetDesc undefined değilse, o zaman

      1. Eğer targetDesc.[[Configurable]] false ise, bir TypeError kuraldışı durumu fırlat.

      2. extensibleTarget = ? IsExtensible(target) olsun.

      3. Eğer extensibleTarget false ise, bir TypeError kuraldışı durumu fırlat.

  9. boolTrapResult döndür.

10.5.8 [[Get]] ( propertyKey, receiver )

Bir Proxy egzotik nesnesi obj'nin [[Get]] iç yöntemi, propertyKey (bir özellik anahtarı) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "get") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? target.[[Get]](propertyKey, receiver) döndür.
  7. trapResult = ? Call(trap, handler, « target, propertyKey, receiver ») olsun.

  8. targetDesc = ? target.[[GetOwnProperty]](propertyKey) olsun.

  9. Eğer targetDesc undefined değilse ve targetDesc.[[Configurable]] false ise, o zaman

    1. Eğer IsDataDescriptor(targetDesc) true ise ve targetDesc.[[Writable]] false ise, o zaman

      1. Eğer SameValue(trapResult, targetDesc.[[Value]]) false ise, bir TypeError kuraldışı durumu fırlat.
    2. Eğer IsAccessorDescriptor(targetDesc) true ise ve targetDesc.[[Get]] undefined ise, o zaman

      1. Eğer trapResult undefined değilse, bir TypeError kuraldışı durumu fırlat.
  10. trapResult döndür.

10.5.9 [[Set]] ( propertyKey, value, receiver )

Bir Proxy egzotik nesnesi obj'nin [[Set]] iç yöntemi, propertyKey (bir özellik anahtarı), value (bir ECMAScript dil değeri) ve receiver (bir ECMAScript dil değeri) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "set") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? target.[[Set]](propertyKey, value, receiver) döndür.
  7. boolTrapResult = ToBoolean(? Call(trap, handler, « target, propertyKey, value, receiver »)) olsun.

  8. Eğer boolTrapResult false ise, false döndür.

  9. targetDesc = ? target.[[GetOwnProperty]](propertyKey) olsun.

  10. Eğer targetDesc undefined değilse ve targetDesc.[[Configurable]] false ise, o zaman

    1. Eğer IsDataDescriptor(targetDesc) true ise ve targetDesc.[[Writable]] false ise, o zaman

      1. Eğer SameValue(value, targetDesc.[[Value]]) false ise, bir TypeError kuraldışı durumu fırlat.
    2. Eğer IsAccessorDescriptor(targetDesc) true ise, o zaman

      1. Eğer targetDesc.[[Set]] undefined ise, bir TypeError kuraldışı durumu fırlat.
  11. true döndür.

10.5.10 [[Delete]] ( propertyKey )

Bir Proxy egzotik nesnesi obj'nin [[Delete]] iç yöntemi, propertyKey (bir özellik anahtarı) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "deleteProperty") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? target.[[Delete]](propertyKey) döndür.
  7. boolTrapResult = ToBoolean(? Call(trap, handler, « target, propertyKey »)) olsun.

  8. Eğer boolTrapResult false ise, false döndür.

  9. targetDesc = ? target.[[GetOwnProperty]](propertyKey) olsun.

  10. Eğer targetDesc undefined ise, true döndür.

  11. Eğer targetDesc.[[Configurable]] false ise, bir TypeError kuraldışı durumu fırlat.

  12. extensibleTarget = ? IsExtensible(target) olsun.

  13. Eğer extensibleTarget false ise, bir TypeError kuraldışı durumu fırlat.

  14. true döndür.

10.5.11 [[OwnPropertyKeys]] ( )

Bir Proxy egzotik nesnesi obj'nin [[OwnPropertyKeys]] iç yöntemi hiçbir argüman almaz ve ya özellik anahtarlarından oluşan bir Liste içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "ownKeys") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? target.[[OwnPropertyKeys]]() döndür.
  7. trapResultArray = ? Call(trap, handler, « target ») olsun.

  8. trapResult = ? CreateListFromArrayLike(trapResultArray, property-key) olsun.

  9. Eğer trapResult herhangi bir yinelenen girdi içeriyorsa, bir TypeError kuraldışı durumu fırlat.

  10. extensibleTarget = ? IsExtensible(target) olsun.

  11. targetKeys = ? target.[[OwnPropertyKeys]]() olsun.

  12. Assert: targetKeys, özellik anahtarlarından oluşan bir Listedir.

  13. Assert: targetKeys yinelenen girdi içermez.

  14. targetConfigurableKeys = yeni bir boş Liste olsun.

  15. targetNonconfigurableKeys = yeni bir boş Liste olsun.

  16. targetKeys'in her bir key öğesi için,

    1. propertyDesc = ? target.[[GetOwnProperty]](key) olsun.

    2. Eğer propertyDesc undefined değilse ve propertyDesc.[[Configurable]] false ise, o zaman

      1. key'i targetNonconfigurableKeys'e ekle.
    3. Değilse,

      1. key'i targetConfigurableKeys'e ekle.
  17. Eğer extensibleTarget true ise ve targetNonconfigurableKeys boşsa, o zaman

    1. trapResult döndür.
  18. uncheckedResultKeys, öğeleri trapResult'ın öğeleri olan bir Liste olsun.

  19. targetNonconfigurableKeys'in her bir key öğesi için,

    1. Eğer uncheckedResultKeys, key'i içermiyorsa, bir TypeError kuraldışı durumu fırlat.

    2. key'i uncheckedResultKeys'ten kaldır.

  20. Eğer extensibleTarget true ise, trapResult döndür.

  21. targetConfigurableKeys'in her bir key öğesi için,

    1. Eğer uncheckedResultKeys, key'i içermiyorsa, bir TypeError kuraldışı durumu fırlat.

    2. key'i uncheckedResultKeys'ten kaldır.

  22. Eğer uncheckedResultKeys boş değilse, bir TypeError kuraldışı durumu fırlat.

  23. trapResult döndür.

10.5.12 [[Call]] ( thisArg, argList )

Bir Proxy egzotik nesnesi obj'nin [[Call]] iç yöntemi, thisArg (bir ECMAScript dil değeri) ve argList (ECMAScript dil değerlerinden oluşan bir Liste) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. handler = obj.[[ProxyHandler]] olsun.

  4. Assert: handler bir Object'tir.

  5. trap = ? GetMethod(handler, "apply") olsun.

  6. Eğer trap undefined ise, o zaman

    1. ? Call(target, thisArg, argList) döndür.
  7. argArray = CreateArrayFromList(argList) olsun.

  8. ? Call(trap, handler, « target, thisArg, argArray ») döndür.

10.5.13 [[Construct]] ( argList, newTarget )

Bir Proxy egzotik nesnesi obj'nin [[Construct]] iç yöntemi, argList (ECMAScript dil değerlerinden oluşan bir Liste) ve newTarget (bir oluşturucu) argümanlarını alır ve ya bir Object içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? ValidateNonRevokedProxy(obj) işlemini gerçekleştir.

  2. target = obj.[[ProxyTarget]] olsun.

  3. Assert: IsConstructor(target) true'dur.

  4. handler = obj.[[ProxyHandler]] olsun.

  5. Assert: handler bir Object'tir.

  6. trap = ? GetMethod(handler, "construct") olsun.

  7. Eğer trap undefined ise, o zaman

    1. ? Construct(target, argList, newTarget) döndür.
  8. argArray = CreateArrayFromList(argList) olsun.

  9. newObj = ? Call(trap, handler, « target, argArray, newTarget ») olsun.

  10. Eğer newObj bir Object değilse, bir TypeError kuraldışı durumu fırlat.

  11. newObj döndür.

10.5.14 ValidateNonRevokedProxy ( proxy )

Soyut işlem ValidateNonRevokedProxy, proxy (bir Proxy egzotik nesnesi) argümanını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. proxy iptal edilmişse bir TypeError kuraldışı durumu fırlatır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer proxy.[[ProxyTarget]] null ise, bir TypeError kuraldışı durumu fırlat.

  2. Assert: proxy.[[ProxyHandler]] null değildir.

  3. unused döndür.

10.5.15 ProxyCreate ( target, handler )

Soyut işlem ProxyCreate, target (bir ECMAScript dil değeri) ve handler (bir ECMAScript dil değeri) argümanlarını alır ve ya bir Proxy egzotik nesnesi içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Yeni Proxy nesnelerinin oluşturulmasını belirtmek için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer target bir Object değilse, bir TypeError kuraldışı durumu fırlat.

  2. Eğer handler bir Object değilse, bir TypeError kuraldışı durumu fırlat.

  3. proxy = MakeBasicObject[[ProxyHandler]], [[ProxyTarget]] ») olsun.

  4. proxy'nin [[Call]] ve [[Construct]] dışındaki temel iç yöntemlerini 10.5'te belirtilen tanımlara ayarla.

  5. Eğer IsCallable(target) true ise, o zaman

    1. proxy.[[Call]]10.5.12'de belirtildiği gibi ayarla.

    2. Eğer IsConstructor(target) true ise, o zaman

      1. proxy.[[Construct]]10.5.13'te belirtildiği gibi ayarla.
  6. proxy.[[ProxyTarget]]target olarak ayarla.

  7. proxy.[[ProxyHandler]]handler olarak ayarla.

  8. proxy döndür.