JS __proto__ "eğlenceli" bir gerçek
Beni yeterince uzun süredir takip ettiyseniz __proto__
, her zaman ne kadar karşı olduğumu zaten biliyorsunuz ve yine de, uzun bir süre önce ECMAScript standardına geçtiğinden beri , en azından bir nesneyi işaretlemek için kullanımını kabul edilebilir bulduğum nadir durumlar var. :
const factory = (fields, {prototype} = Object) => ({
__proto__: prototype,
...fields
});
// mimic an <a /> reference
factory({href: '/'}, HTMLAnchorElement);
Performansı bir kenara bırakırsak ve lütfen dikkat edin __proto__
, vahşi doğada kullanımını hiç önermiyorum, bu gönderi başka nedenlerle var.
Object.prototype.__proto__
Herkesin __proto__ erişimcisinin ne yaptığını bildiğinden oldukça eminim , bu yüzden size bir meydan okuma önermek istiyorum… ve evet, bunların hepsi geçerli JS:
class Test {}
const __proto__ = Test.prototype;
// what do these operations return?
({__proto__} instanceof Test);
({__proto__: __proto__} instanceof Test);
({"__proto__": __proto__} instanceof Test);
({["__proto__"]: __proto__} instanceof Test);
// what do these operations return?
({__proto__}.__proto__ === Test.prototype);
({__proto__: __proto__}.__proto__ === Test.prototype);
({"__proto__": __proto__}.__proto__ === Test.prototype);
({["__proto__"]: __proto__}.__proto__ === Test.prototype);
Cevabı öğrenmek için kendinize bu parçacıkları çalıştırmadıysanız, bu konuda yardımcı olabilirim! İlk meydan okumada, çıktı yine , ve olacaktır ve false
bunun nedeni , her ikisinin de own property olarak tanımlanmasıdır , oysa sözdizimi yoluyla atama, özel sözdizimi özellikleri kullanılmadan, etrafında tırnak işaretleri olsa bile fiilen erişimciden geçer.true
true
false
{__proto__}
{["__proto__"]}
Object.prototype.__proto__
Öte yandan, ikinci meydan okumada (all ) doğrudan veya as olarak true
erişmemiz gerçekten önemli değil , bu nedenle temelde ayarlayıcıyı tetikleme biçimimizden alıcıyı bir kez tetikleyebilme biçimimizde sıfır simetri vardır. ya kendi mülküdür ya da sihirli bir miras kapısıdır.__proto__
["__proto__"]
__proto__
__proto__
… ve sadece __proto__ değil
Kendimi kontrol etmedim, ancak her eski __xxx__
özel erişimcinin aynı __proto__
lanetten muzdarip olduğuna inanıyorum, bu nedenle, denerseniz işler kolayca çıldırabileceğinden, özellikleri gerçek amacınız ve beklentilerinizle atamak için en yeni JS sözdizimini karıştırırken lütfen dikkatli olun. bu özellikleri atamada akıllı olun .
Ve hepsi bu millet!
Bu gönderiden alınacak tek çıkarım muhtemelen şu şekilde özetlenebilir:
- bugün veya yarın, bunların yeni sözdizimiyle nasıl davrandığına dair sürprizlerden kaçınmak istiyorsanız, dilin eski ama işleyen kısımlarını kullanmayın.
- bir nesnenin prototipini manuel olarak ayarlamak kesinlikle gerekli olduğunda açık (ve ne yazık ki daha yavaş) tercih
Object.setPrototypeOf
edin, ancak mümkün olduğunda diğer her durumda sınıfları kullanın - bu gönderiyi hafızanızdan silin veya " Kodlarımda asla kullanmamalıyım " gibi kısa bir cümleye sıkıştırın ve beyninizi veya duygularınızı karıştırmayan yeni ve süslü şeyler öğrenerek ilerleyin.
__proto__