JS __proto__ "eğlenceli" bir gerçek

Nov 26 2022
Beni yeterince uzun süredir takip ettiyseniz, __proto__'ya 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 markalamak için kullanıldığını gördüğüm nadir durumlar var. kabul edilebilir: Performansı bir kenara bırakırsak ve lütfen dikkat edin, __proto__'nın vahşi doğada kullanılmasını kesinlikle önermiyorum, bu gönderi başka nedenlerle var. Nesne.
Unsplash'ta Mark Williams'ın fotoğrafı

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);

Firefox'ta __proto__, yeni Sınıftan daha iyi puan alıyor

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 falsebunun 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.truetruefalse{__proto__}{["__proto__"]}Object.prototype.__proto__

Öte yandan, ikinci meydan okumada (all ) doğrudan veya as olarak trueeriş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.setPrototypeOfedin, 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__