摘要:事情的起因是在問(wèn)答上看到一個(gè)朋友的提問(wèn),問(wèn)的是阮一峰老師入門(mén)上關(guān)于關(guān)鍵字的一段代碼問(wèn)題,下面是這個(gè)代碼的截圖這位樓主說(shuō)他覺(jué)得的值不是,下面有網(wǎng)友說(shuō)把代碼粘貼到控制臺(tái)一試就是這結(jié)果沒(méi)錯(cuò),后來(lái)樓主說(shuō)是他想錯(cuò)了。
事情的起因是在問(wèn)答上看到一個(gè)朋友的提問(wèn),問(wèn)的是阮一峰老師 ECMAScript 6 入門(mén) 上關(guān)于super關(guān)鍵字的一段代碼問(wèn)題,下面是這個(gè)代碼的截圖:
這位樓主說(shuō)他覺(jué)得 this.x 的值不是3,下面有網(wǎng)友說(shuō)把代碼粘貼到 chrome 控制臺(tái)一試就是這結(jié)果沒(méi)錯(cuò),后來(lái)樓主說(shuō)是他想錯(cuò)了。我也順便把代碼粘貼到 chome 下執(zhí)行后答案也確實(shí)是3。
本來(lái)這個(gè)事沒(méi)啥就結(jié)束了,正好我開(kāi)著 WebStorm 準(zhǔn)備寫(xiě)代碼,順手粘貼到代碼文件里面,保存 > webpack打包 > 刷新瀏覽器,瞅了一眼 Console:
!這是神馬情況,輸出竟然是2!
問(wèn)題分析為啥與 chrome 直接運(yùn)行的結(jié)果不一致呢?想了想問(wèn)題應(yīng)該出在 Babel 轉(zhuǎn)碼上。馬上打開(kāi)轉(zhuǎn)碼后的文件,定位到這段代碼的位置:
var B = function (_A) { _inherits(B, _A); function B() { _classCallCheck(this, B); var _this = _possibleConstructorReturn(this, (B.__proto__ || Object.getPrototypeOf(B)).call(this)); _this.x = 2; _set(B.prototype.__proto__ || Object.getPrototypeOf(B.prototype), "x", 3, _this); console.log(_get(B.prototype.__proto__ || Object.getPrototypeOf(B.prototype), "x", _this)); // undefined console.log(_this.x); // 3 return _this; } return B; }(A);
super.x = 3; 對(duì)應(yīng)的是 _set(B.prototype.__proto__ || Object.getPrototypeOf(B.prototype), "x", 3, _this); 這里有個(gè) _set() 函數(shù),再看下這個(gè) _set() 是啥:
var _set = function set(object, property, value, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent !== null) { set(parent, property, value, receiver); } } else if ("value" in desc && desc.writable) { desc.value = value; } else { var setter = desc.set; if (setter !== undefined) { setter.call(receiver, value); } } return value; };
仔細(xì)看看這個(gè)函數(shù)后,明白是怎么回事了。結(jié)合阮一峰老師的代碼和上面的轉(zhuǎn)碼可以看出,_set() 傳進(jìn)來(lái)的第一個(gè)參數(shù)是 B.prototype.__proto__ -- 也就是A的原型對(duì)象 -- A.prototype,第一句代碼會(huì)先找 x屬性 的描述符,如果找不到繼續(xù)順著原型鏈找... 當(dāng)然是找不到的了,所以相當(dāng)于啥也沒(méi)執(zhí)行,this.x 的值依然是2。
如果按照這個(gè) _set() 函數(shù)的邏輯,在什么情況下 this.x 的值才會(huì)是3呢?要滿足兩個(gè)條件:
A.prototype 上必須有 x 屬性定義
這個(gè) x 屬性定義上還必須定義 set 訪問(wèn)器
比如像下面這樣:
Object.defineProperty(A.prototype, "x", { get: function () { return this._x; }, set: function (value) { this._x = value; } });
然后再跑一把,果然 this.x 的值是3了!等一下... 怎么 console.log(super.x); // undefined 這句的結(jié)果不是 undefined 也是3了呢?看下轉(zhuǎn)碼那里還有個(gè) _get() 函數(shù):
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
好吧,代碼走到最后 else 的 getter 那里了,自然 super.x 的讀取結(jié)果就是3了
目前還沒(méi)時(shí)間看為啥 Babel 要這么轉(zhuǎn)碼處理,如果你有答案了歡迎留言討論。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/96042.html
一、前言通過(guò)CRA腳手架構(gòu)建的項(xiàng)目,一般webpack配置是隱藏的,如果要修改,就要另外處理。想要修改webpack通常有兩種方式通過(guò)插件去增加或覆蓋webpack配置(方法一、方法二)或者釋放項(xiàng)目中的webpack配置,使之可見(jiàn),然后可以修改(方法三)本來(lái)CRA腳手架將webpack等復(fù)雜的配置封裝在項(xiàng)目中,后續(xù)可以通過(guò)更新react-scripts來(lái)體驗(yàn)版本升級(jí)帶來(lái)的新特性,但有些時(shí)候確實(shí)需要...
摘要:,是一個(gè)前端資源加載打包工具,現(xiàn)在版本已經(jīng)到,今天的文章不支持介紹的及使用,而是對(duì)最近項(xiàng)目開(kāi)發(fā)中使用打包時(shí)處理低版本及以下瀏覽器兼容問(wèn)題做一次總結(jié)。 Webpack,Webpack 是一個(gè)前端資源加載/打包工具,現(xiàn)在版本已經(jīng) release 到 v2.6.1,今天的文章不支持介紹Webpack的API及使用,而是對(duì)最近項(xiàng)目開(kāi)發(fā)中使用Webpack打包時(shí)處理IE低版本(IE8及以下)瀏覽...
小編寫(xiě)這篇文章的主要目的,主要是對(duì)pandas做一個(gè)較為詳細(xì)的一個(gè)解答,pandas其實(shí)就是一個(gè)數(shù)據(jù)模型庫(kù),里面的內(nèi)容還是比較的多的,那么,怎么樣對(duì)海量的數(shù)據(jù)進(jìn)行處理呢?處理的內(nèi)容就是對(duì)超大的csv文件進(jìn)行快速拆分,下面就給大家舉例驗(yàn)證?! ∏把浴 ”疚慕榻B如何利用pandas對(duì)超大CSV文件進(jìn)行快速拆分?! ?.操作步驟 1.1安裝pandas pipinstallpandas 1.2...
摘要:我們將循環(huán)執(zhí)行五次,每次將一個(gè)函數(shù)到數(shù)組中。只有當(dāng)你理解了,才能給出正確的答案。讀者提到的兩個(gè)問(wèn)題聲明的變量不是完全不可更改。不僅如此,而且有些最新的瀏覽器也還沒(méi)有支持。 譯者按: 使用let的確會(huì)比var安全很多。 原文: Why You Shouldn’t Use ‘var’ Anymore 譯者: Fundebug 為了保證可讀性,本文采用意譯而非直譯。 我已經(jīng)使用ES2015(...
閱讀 2268·2021-11-22 11:56
閱讀 2700·2021-10-08 10:05
閱讀 8035·2021-09-22 15:53
閱讀 2008·2021-09-22 15:29
閱讀 2288·2021-09-08 09:35
閱讀 3447·2021-09-07 10:12
閱讀 1441·2019-08-30 13:11
閱讀 2088·2019-08-28 17:54