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

Nesne özellikleriyle etkileşiminizin büyük kısmı nesne değişmez değerleri oluşturma, ayarlama ve erişim dahil olmak üzere yüzey düzeyinde özellik değerlerini kullanır. Ancak, bu özelliklere nasıl erişileceği üzerinde ayrıntılı kontrol için bir nesne olarak benzersiz bir deneyim. Her nesne özelliğinin bir dizi görünmez özelliği vardır o mülkle ilişkili "mülk" adlı meta verileri içeren tanımlar."

Herhangi bir mülkle ilişkilendirilmiş iki tür tanımlayıcı vardır: veri tanımlayıcıları ve erişimci tanımlayıcıları. Veri tanımlayıcısı, olup olmadığına bakılmaksızın, bir özelliğin değerini içeren anahtar ve değer çiftlerini değer yazılabilir, yapılandırılabilir veya numaralandırılabilir. Erişimci tanımlayıcıları şunu içerir: Bir özellik ayarlandığında, değiştirildiğinde veya erişildiğinde yürütülen işlevler.

Özellik Açıklayıcı türü
Object.defineProperty() değerinden varsayılan değer
Açıklama
[[Value]] Veriler undefined Bir özelliğin değerini içerir.
[[Writable]] Veriler false Mülkün değerini değiştirip değiştiremeyeceğinizi belirler.
[[Get]] Erişen undefined Özelliğin getter işlevi mülke erişildiğinden emin olun.
[[Set]] Erişen undefined Özelliğin setter işlevi özelliğinin ayarlanması veya değiştirilmesi anlamına gelir.
[[Configurable]] Her ikisi de false Bu false ise mülk silinemez ve özellikleri değiştirilemez. Bu false ve [[Writable]] true ise özelliğin değeri: değiştirebilirsiniz.
[[Enumerable]] Her ikisi de false Bu true ise mülk üzerinde iterasyon yapabilirsiniz: for...in döngü veya Object.keys() statik yöntemidir.

Bu özelliklerin her biri, [[Prototype]] ile aynı kısaltmayı kullanır. Bu tanımlayıcı bu mülklere doğrudan erişilmemesi gerekir. Bunun yerine Object.defineProperty() statik yönteminde bir nesnesini tanımlayın. Object.defineProperty(), üç bağımsız değişkeni kabul eder: İşlem yapılacak nesne, oluşturulacak veya değiştirilecek özellik anahtarı ve oluşturulan veya değiştirilen mülkle ilişkilendirilen tanımlayıcılar.

Varsayılan olarak, Object.defineProperty() kullanılarak oluşturulan mülkler yazılabilir, numaralandırılabilir veya yapılandırılabilir değildir. Ancak oluşturduğunuz tüm mülkler veya nokta ya da ayraç gösteriminin kullanılması, 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]], false değerine sahip olduğunda yeni bir değer ayarlamaya çalışılır katı modun dışında sessiz bir şekilde başarısız olur ve yüksek düzey modunda hata oluştu:

{
    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, ekibinizin bu bilgiyi daha yaygın şekilde nesnelerle çalışmada kullanılan söz dizimleri. Örneğin, bu kavramlar Object.create() statik yöntemi kullanılırken devreye girer, Bu da yeni sürüme eklenen tüm prototipler üzerinde ayrıntılı kontrol nesnesini tanımlayın.

Object.create(), mevcut bir nesneyi oluşturacaksınız. Bu, yeni nesnenin başka bir nesneden özellik ve yöntem devralmasına olanak tanır Nesnelerin sahip olduğu özellikleri devralmasıyla aynı şekilde kullanıcı tanımlı nesne JavaScript'in yerleşik Object prototipi. Object.create() öğesini şununla çağırdığınızda: bağımsız değişken olarak gösteren bir nesne olursa, iletilen nesneyi ortaya çıkarmanıza yardımcı olabilir.

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 kullanılarak yeni oluşturulmuş nesne— Yani, bir nesne eşleme anahtarları bir tanımlayıcı özellik kümesiyle eşlenir:

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) bir nesne değişmez değeri kullanıyor (myCustomPrototype), kendisi devralınan Object.prototype adı verilen bir dizi devralınan prototip elde edilir. prototip zinciri. Her nesnenin atanmış veya devralınmış bir prototipi vardır Kendisine ait bir atanmış veya devralınan prototipe sahip. Bu zincirin sonu: Kendi prototipi olmayan null prototipi.

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 "üst düzeyde" kullanılabilir bir nesnenin çalıştırılması için, doğrudan prototip özelliğine erişmeye gerek kalmadan:

const objectLiteral = {
    "value" : true
};

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

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

Bu kalıp, bir e-tabloyla ilişkilendirilmiş prototip zincirinin tamamı için geçerlidir. nesne: bir mülke erişmeye çalışırken çevirmen, her bir "düzeyde" baştan sona kadar her şeyi karakteri veya zincir bitişini bulduğunda:

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]]