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