Mülk açıklayıcıları

Nesne özellikleriyle etkileşiminizin büyük kısmı, nesne değişmez değerleri oluşturma ve anahtarları kullanarak özellik değerlerine erişme ve bunu ayarlama dahil olmak üzere muhtemelen yüzey düzeyinde olacaktır. Bununla birlikte, bir nesnenin herhangi bir özelliğini, bu özelliklere erişildiği, değiştirildiği ve tanımlandığı üzerinde ayrıntılı bir denetim için dahili olarak yapılandırabilirsiniz. Her nesne özelliğinde, "özellik açıklayıcıları" adı verilen ve o özellikle ilişkili meta verileri içeren bir dizi görünmez özellik bulunur.

Herhangi bir özellikle ilişkili iki tür tanımlayıcı vardır: veri tanımlayıcıları ve erişimci tanımlayıcıları. Veri açıklayıcılar, bir özelliğin değerini içeren anahtar ve değer çiftlerini içerir. Bu değer, değerin yazılabilir, yapılandırılabilir veya numaralandırılabilir olmasından bağımsızdır. Erişimci açıklayıcıları, bir özellik ayarlandığında, değiştirildiğinde veya erişildiğinde yürütülen işlevler içerir.

Özellik Açıklayıcı türü
Object.defineProperty() olan varsayılan değer
Açıklama
[[Value]] Veriler undefined Bir özelliğin değerini içerir.
[[Writable]] Veriler false Özelliğin değerini değiştirip değiştiremeyeceğinizi belirler.
[[Get]] Erişen undefined Mülke erişildiğinde mülkün getter işlevi yürütülür.
[[Set]] Erişen undefined Özellik ayarlandığında veya değiştirildiğinde yürütülen özelliğin setter işlevi.
[[Configurable]] Her ikisi de false Bu false ise özellik silinemez ve özellikleri değiştirilemez. Bu false ve [[Writable]] ise true ise özelliğin değeri yine de değiştirilebilir.
[[Enumerable]] Her ikisi de false Bu true ise for...in döngülerini veya Object.keys() statik yöntemini kullanarak özellik üzerinde yineleme yapabilirsiniz.

Bu özelliklerin her biri [[Prototype]] ile aynı kısaltmayı kullanır. Bu, söz konusu özelliklerin doğrudan erişilmesi amaçlanmadığını gösterir. Bunun yerine, bir nesnenin özelliklerini tanımlamak veya değiştirmek için Object.defineProperty() statik yöntemini kullanın. Object.defineProperty() üç bağımsız değişkeni kabul eder: Üzerinde işlem yapılacak nesne, oluşturulacak veya değiştirilecek özellik anahtarı ve oluşturulan veya değiştirilen özellikle ilişkili açıklayıcıları içeren bir nesne.

Varsayılan olarak, Object.defineProperty() kullanılarak oluşturulan özellikler yazılabilir, numaralandırılabilir veya yapılandırılamaz. Bununla birlikte, nesne değişmez değerinin bir parçası olarak veya nokta ya da köşeli parantez gösterimi kullanarak oluşturduğunuz herhangi bir özellik yazılabilir, numaralandırılabilir ve yapılandırılabilir.

const myObj = {};

Object.defineProperty(myObj, 'myProperty', {
  value: true,
  writable: false
});

myObj.myProperty;
> true

myObj.myProperty = false;

myObj.myProperty;
> true

Örneğin, [[Writable]] bir false değerine sahip olduğunda, ilişkili özellik için yeni bir değer ayarlamaya çalışıldığında yüksek düzey modun dışında sessizce başarısız olur ve katı kurallı modda hata verir:

{
    const myObj = {};

    Object.defineProperty(myObj, 'myProperty', {
    value: true,
    writable: false
    });

    myObj.myProperty = false;
    myObj.myProperty;
}
> true

(function () {
    "use strict";
    const myObj = {};

    Object.defineProperty(myObj, 'myProperty', {
    value: true,
    writable: false
    });

    myObj.myProperty = false;
    myObj.myProperty;
}());\
> Uncaught TypeError: "myProperty" is read-only

Tanımlayıcılardan etkili bir şekilde yararlanmak oldukça ileri düzey bir kavramdır, ancak bir nesnenin iç yapısını anlamak, nesnelerle daha yaygın şekillerde çalışırken kullanılan söz dizimini anlamak için çok önemlidir. Örneğin, yeni nesneye eklenen tüm prototipler üzerinde size ayrıntılı kontrol sağlayan Object.create() statik yöntemi kullanılırken bu kavramlar devreye girer.

Object.create(), prototip olarak mevcut bir nesneyi kullanarak yeni bir nesne oluşturur. Bu, nesnelerin JavaScript'in yerleşik Object prototipinden özellikleri devralması gibi yeni nesnenin özellikleri ve yöntemleri başka bir kullanıcı tanımlı nesneden devralmasını sağlar. Object.create() yöntemini bağımsız değişken olarak bir nesneyle çağırdığınızda, iletilen nesnenin prototipi olduğu boş bir nesne oluşturulur.

const myCustomPrototype = {
  'myInheritedProp': 10
};

const newObject = Object.create( myCustomPrototype );

newObject;
> Object {  }
<prototype>: Object { myInheritedProp: 10 }
  myInheritedProp: 10
  <prototype>: Object { … }

Object.create, Object.defineProperty() benzeri bir söz dizimi kullanarak, yeni oluşturulan nesne için kendi özelliklerini belirten ikinci bir bağımsız değişken alabilir. Bu, bir dizi açıklayıcı özellik ile nesne eşleme anahtarı oluşturabilir:

const myCustomPrototype = {
  'myInheritedProp': 10
};

const myObj = Object.create( myCustomPrototype, {
        myProperty: {
            value: "The new property value.",
            writable: true,
            configurable: true
        }
  });

myObj;
> Object { … }
    myProperty: "The new property value."
    <prototype>: Object { myInheritedProp: 10 }

Bu örnekte yeni nesne (myObj), prototip olarak bir nesne değişmez değerini (myCustomPrototype) kullanır. Bu nesne, kendisi devralınan Object.prototype değerini içerir ve bunun sonucunda, prototip zinciri olarak adlandırılan bir dizi devralınmış prototip elde edilir. Her nesnenin, atanmış veya devralınmış bir prototipi vardır. Bu prototipin kendine ait atanmış veya devralınmış bir prototipi bulunur. Bu zincir, kendi prototipi olmayan bir null prototipinde sona ermektedir.

const myPrototype = {
  'protoProp': 10
};

const newObject = Object.setPrototypeOf( { 'objProp' : true }, myPrototype );

newObject;
> Object { objProp: true }
    objProp: true
    <prototype>: Object { protoProp: 10 }
        protoProp: 10
        <prototype>: Object { … }

Bir değerin prototipinde yer alan özellikler, prototip özelliğine doğrudan erişime gerek kalmadan bir nesnenin "en üst düzeyinde" kullanılabilir:

const objectLiteral = {
    "value" : true
};

objectLiteral;
> Object { value: true }
    value: true
    <prototype>: Object { … }

objectLiteral.toString();
"[object Object]"

Bu kalıp, bir nesneyle ilişkilendirilen prototip zincirinin tamamı için geçerlidir: Bir özelliğe erişmeye çalışırken yorumlayıcı, özelliği bulana veya zincir sona erene kadar prototip zincirinin her "düzeyinde" yukarıdan aşağıya doğru bu özelliği arar:

const myCustomPrototype = {
  'protoProp': "Prototype property value."
};

const myObj = Object.create( myCustomPrototype, {
    myProperty: {
        value: "Top-level property value.",
        writable: true,
        configurable: true
    }
});

myObj.protoProp;
> "Prototype property value."

Öğrendiklerinizi sınayın

Hangi tanımlayıcılar erişimcidir?

[[Get]]
[[Set]]
[[Writable]]