近期的 smoothgate 事宜有感亂侃

本文屬於亂侃,个中言語能夠包括語句不通以至語無倫次前後不搭的部份。如激發列位看官的不適請包涵

因而 Array.prototype.flatten 終究變成 Array.prototype.flat 了:https://github.com/tc39/propo…。要領名變成了一個名詞或形容詞。

我置信這不是規範制定者所寧願的(雖然有人 強行 詮釋了一下)。萬惡之源就是這個叫做 Mootools 的庫。我沒有用過,然則聽說在多年之前的外洋被普遍運用。我不想細談其內部細節,有興緻的能夠看谷歌的這篇博文:https://developers.google.com…

實在相似事變之前就發生過一次。題目出在同一個庫身上,雷同的解決方案:Array.prototype.contains 終究變成了 Array.prototype.includes

所謂兼容性就是抗汗青包袱。假如一個新版本閱讀器宣布致使用戶常常閱讀的網站掛掉,他們不會以為這是網站的不對——他們基礎不知道相似 Mootools 這類奇葩的存在。他們只知道:我本來用得好好的,怎樣晉級以後就壞了?從而加固“跟新有風險,晉級需謹慎”的印象,以至構成“晉級恐懼症”。

其他言語或多或少都有一些汗青包袱,非常極重的有如 C++,然則這類編譯型言語一旦被編譯為目的代碼,兼容性包袱便轉拋給了操作系統。而前端代碼不一樣,他們被閱讀器下載到了客戶端詮釋(或預編譯)實行,言語級別的包袱會一向延續下去。言語設計者們已做過了嘗試,比方這個奇異的 'use strict',然則它永久不能夠默許開啟。

所以 Mootools 那幫人在擅自擴展原生對象的原型屬性時,有無想到着多是一件會障礙人類文明的生長曆程的嚴重題目呢?

照樣補充申明此次 smoothgate 事宜的啟事。

Firefox 基於 Array.prototype.flatten 發起(舊版本,如今已改成 flat)宣布了支撐該 API 的新版閱讀器,致使了最少一個有名站點湧現了非常

Firefox 供應的 Array.prototype.flatten 完成並沒有 bug,題目在於網站運用的一個叫 Mootools 的庫。它供應了本身 非規範的 Array.prototype.flatten 版本完成。

Array.prototype.flatten = /* 非規範完成 */;

Mootools 供應的完成跟規範差別,但是這不是題目所在。Mootools 會強迫掩蓋閱讀器原生的 Array.prototype.flatten 完成,依靠 MootoolsArray.prototype.flatten 完成的網站並不會由於原生版本和 Mootools 版本不一致而發生題目。

但是不幸的是 Mootools 還做了一件噁心的事變:它會把一切自定義的 Array.prototype 下要領完成複製到 Elements.prototype 下(ElementsMootools 供應的自定義 API)。

for (var key in Array.prototype) {
  Elements.prototype[key] = Array.prototype[key];
}

for-in 輪迴只會遍歷 可羅列的(enumerable)的屬性,比方 Array.prototype.sortArray.prototype.push 這些原生的要領都是默許不可羅列的(enumerable: false),新的 Array.prototype.flatten 一樣云云。Mootools 用本身的完成掩蓋了原生的 Array.prototype.flatten,然則並沒有改變要領的 enumerable 屬性——Array.prototype.flatten 仍然是不可羅列的,致使 Array.prototype.flatten 不會被複制到 Elements.prototype 下。

因而:一切依靠 Elements.prototype.flatten 的代碼悉數掛掉了。有人在 TC39 的官方 github 堆棧發了個 PR 戲謔說發起把 flatten 改名為 smooth,激發大議論,以至有人信以為真致使事宜更加擴展。因而 Google Update 官博特地發文闢謠。

    原文作者:CarterLi
    原文地址: https://segmentfault.com/a/1190000015051866
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞