Global nesnenin bazı yerleşik özelliklerini neden silebiliriz?


12

Bu gün es5 okuyorum ve küresel nesnenin bazı yerleşik özelliklerinde [[yapılandırılabilir]] özniteliğinin true olarak ayarlandığını ve bu özellikleri silebileceğimizi buluyorum.

Örneğin:

Array.prototype nesnesinin join yönteminin öznitelikleri vardır

{[[Writable]]:true, [[Enumerable]]: false, [[Configurable]]: true}

Böylece Array için birleştirme yöntemini kolayca silebiliriz:

delete Array.prototype.join;
alert([1,2,3].join);

Uyarı undefinedbenim krom 17, firefox 9, yani 10, hatta ie6;

Chrome 15 ve safari 5.1.1'de [[yapılandırılabilir]] özelliği true olarak ayarlanmıştır ve silme sonucu da doğrudur ancak nihai sonuç yine de geçerlidir function(){[native code]}. Bu bir hata gibi görünüyor ve krom düzeltti.

Bunu daha önce fark etmedim. Bence, kullanıcı kodundaki yerleşik işlevleri silmek tehlikelidir ve başkalarıyla çalışırken çok fazla hata ortaya çıkarır. Peki neden ECMAScript bu kararı verir?


Birden çok yanıt, özellikleri silerek yerleşik işlevselliği özelleştirme yeteneğinden ötürü, ancak bu yaklaşım yalnızca işlevsellik DI'yi kullanmak yerine genel değişkenlerde kablo bağlantılı olduğu için gereklidir. Mülkleri silerek kişiselleştirmek, temelde kötü bir tasarımın etrafında bir hack gibi görünüyor. Örneğin, JSON ayrıştırıcısını değiştirmeniz gerekirse, JSON ayrıştırıcısını girdi olarak alan bir kod yazabilirsiniz.
Monica'yı

Yanıtlar:


2

Sizinle aynı fikirde olmaya meyilliyim, ancak diğer yandan Firefox 3.5'tekidelete JSON.stringify bir hata nedeniyle belirli durumlarda ihtiyacım olan bir durum buldum . Kesinlikle orada maymun yama inşa yeteneğinden memnun oldu.


Neden sadece geçersiz kılmıyorsun?
51'de demix

2
Bir sonraki şey JSON2.js yüklenir, bu da varlığını algılar JSON.stringifyve gerekirse enjekte eder. Özür dilerim, cevabımda bunu açıklamadım.
N3dst4

Böylece JSON2.js'nin kaynak kodunu da değiştirebilirsiniz, lol
demix

Üçüncü taraf kitaplıklarını değiştirmek kötü bir fikirdir, çünkü o zaman tüm değişikliklerinizi kopyalamaksızın onları yükseltemezsiniz.
N3dst4

1

Yapılandırılabilir silme ile ilgili değildir.

Bu salt okunur bir değeri değiştirme yeteneğiyle ilgilidir .

Çok güçlü bir araçtır ve yapılandırılamayan değerler silemezseniz sinir bozucu olur.

Belirsiz bir hatayı düzeltmem veya biraz farklı işlevsellik (müdahale, günlük tutma) enjekte etmem gereken birkaç vaka yaşadım. Bunu yapmak , değerin değiştirilmesini gerektirir .

Misal:

Object.defineProperty(Object.prototype, "foo", {
  value: 42,
  configurable: true
});

var o = {};
o.foo = 50; // fails. foo is not writable
delete Object.prototype.foo;
o.foo = 50; // succeeds
/* optionally put Object.prototype.foo back */

Tüm fikir, özellikleri silebilirseniz daha fazla meta programlama kontrolüne sahip olmanızdır. Onları silemediyseniz, dilde rahatsız olursunuz.

İnsanları kızdırmaktan başka mülkleri silinebilir hale getirmemek için iyi bir neden yoktur.


1
[[Yazılabilir]] özelliği değeri değiştirme yeteneğini kontrol eder. ES5'te: [[Yazılabilir]] Boolean Yanlışsa, ECMAScript kodu tarafından [[Put]] kullanarak mülkün [[Değer]] özelliğini değiştirme girişimleri başarılı olmaz . [[Configurable]] Boolean False, özelliği silmeye çalışır, özelliği erişimci özelliği olarak değiştirir veya özelliklerini değiştirir ([[Değer]] dışında) başarısız olur.
57'de demix

@demix Evet, bu doğru ...
Raynos

0

..kullanıcı kodundaki yerleşik işlevleri silmek tehlikelidir

Aksine. Özelleştirmeye izin vermek iyidir çünkü web sitesi yazarlarının daha fazla esnekliğe sahip olmasını sağlar.

Web sitesi yazarının 3. taraf kodunu aynı JS VM'ye yüklemesi gerekiyorsa ve bunun için dahili JS ayrıştırıcısını kullanmak isterse, 3. taraf kodunu yüklemeden önce özellikleri yapılandırılamaz olarak ayarlayarak her zaman güvenliğini sağlayabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.