亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Babel轉(zhuǎn)碼關(guān)于 "super" 的注意事項(xiàng)

rose / 1274人閱讀

摘要:事情的起因是在問(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ān)文章

  • react項(xiàng)目關(guān)于webpack配置修改

    一、前言通過(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í)需要...

    社區(qū)管理員 評(píng)論0 收藏0
  • 煦涵說(shuō)Webpack-IE低版本兼容指南

    摘要:,是一個(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及以下)瀏覽...

    tanglijun 評(píng)論0 收藏0
  • 如何使用pandas對(duì)超大csv文件進(jìn)行快速拆分詳解

      小編寫(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...

    89542767 評(píng)論0 收藏0
  • ES6之"let"能替代"var"嗎?

    摘要:我們將循環(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(...

    lewinlee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<