成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

(詳解)你應(yīng)該知道的new操作符

y1chuan / 2123人閱讀

摘要:使用指定的參數(shù)調(diào)用構(gòu)造函數(shù),并將綁定到新創(chuàng)建的對象。等同于,也就是沒有指定參數(shù)列表,不帶任何參數(shù)調(diào)用的情況。由構(gòu)造函數(shù)返回的對象就是表達(dá)式的結(jié)果。

new

作為大家天天使用的操作符,想必大家都不陌生

創(chuàng)建一個(gè)對象的通用語法

let obj = new Object();

那么在創(chuàng)建對象的過程中,new 到底做了什么?

MDN

當(dāng)代碼 new Foo(...) 執(zhí)行時(shí),會(huì)發(fā)生以下事情:(MDN地址)

一個(gè)繼承自 Foo.prototype 的新對象被創(chuàng)建。

使用指定的參數(shù)調(diào)用構(gòu)造函數(shù) Foo ,并將 this 綁定到新創(chuàng)建的對象。new Foo 等同于 new Foo(),也就是沒有指定參數(shù)列表,F(xiàn)oo 不帶任何參數(shù)調(diào)用的情況。

由構(gòu)造函數(shù)返回的對象就是 new 表達(dá)式的結(jié)果。如果構(gòu)造函數(shù)沒有顯式返回一個(gè)對象,則使用步驟1創(chuàng)建的對象。(一般情況下,構(gòu)造函數(shù)不返回值,但是用戶可以選擇主動(dòng)返回對象,來覆蓋正常的對象創(chuàng)建步驟)

按照這個(gè)過程,我們可以大概的模擬一個(gè)new的實(shí)現(xiàn)

function _new(Super) {
    //返回一個(gè)function
    return (props)=> {
        let obj = {}; //創(chuàng)建一個(gè)新對象
        obj.__proto__ = Super.prototype;//繼承父類的屬性
        let result = Super.apply(obj,props);//調(diào)用Super的構(gòu)造函數(shù)
        return typeof result === "object"? result : obj;; //判斷Super構(gòu)造器總返回一個(gè)Object
    }
}

var a = _new(Super)(["z"])
a;//{name: "z"}
ECMA-262

再次閱讀Ecma262
其過程較MDN多了一些判斷,如:

new Object ( [ value ] )
當(dāng)以一個(gè)參數(shù) value 或者無參數(shù)調(diào)用 Object 構(gòu)造器,采用如下步驟:

如果提供了 value, 則
a.如果 Type(value) 是 Object, 則

  (1)如果 value 是個(gè)原生 ECMAScript 對象 , 不創(chuàng)建新對象,簡單的返回 
  value.
  (2)如果 value 是宿主對象 , 則采取動(dòng)作和返回依賴實(shí)現(xiàn)的結(jié)果的方式可以使 
  依賴于宿主對象的 .

b.如果 Type(value) 是 String, 返回 ToObject(value).
c.如果 Type(value) 是 Boolean, 返回 ToObject(value).
d.如果 Type(value) 是 Number, 返回 ToObject(value).

斷言 : 未提供參數(shù) value 或其類型是 Null 或 Undefined.

令 obj為一個(gè)新創(chuàng)建的原生 ECMAScript 對象 .

設(shè)定 obj 的 [[Prototype]] 內(nèi)部屬性為標(biāo)準(zhǔn)內(nèi)置的 Object 的 prototype 對象.

設(shè)定 obj 的 [[Class]] 內(nèi)部屬性為 "Object".

設(shè)定 obj 的 [[Extensible]] 內(nèi)部屬性為 true.

設(shè)定 obj 的 8.12 指定的所有內(nèi)部方法

返回 obj.

重新來修改下我們的模擬

function _new(Super) {
    //返回一個(gè)function
    return (value) => {
        if (value) {
            switch (typeof value) {
                case "object":
                    //這里因?yàn)椴煌乃拗鳝h(huán)境也就是不同的引擎會(huì)有不同的寫法,找了很多博文書籍也沒有詳解具體的判斷邏輯或方法,只好先寫偽代碼了
                    if (宿主對象) {
                        //采取動(dòng)作和返回依賴實(shí)現(xiàn)的結(jié)果的方式可以使依賴于宿主對象的
                    } else {
                        return value
                    }
                    break;
                case "string":
                    return new String(value);
                    break;
                case "boolean":
                    return new Boolean(value);
                    break;
                case "number":
                    return new Number(value);
                    break;
                default:
                    break;
            }
        }
        let obj = {}; //創(chuàng)建一個(gè)新對象
        obj.__proto__ = Super.prototype; //繼承父類的屬性
        //修改內(nèi)部屬性class 為 “Object”,不過ecma262沒有提供任何方法去修改,只提供了一種訪問方法 Object.prototype.toString.call("我們的對象")
        //修改內(nèi)部屬性Extensible為 true,不過目前沒有提供方法去修改,只有一個(gè)修改為false Object.preventExtensions("我們的對象");
        let result = Super.apply(obj, value); //調(diào)用Super的構(gòu)造函數(shù)
        return typeof result === "object" ? result : obj;; //判斷Super構(gòu)造器總返回一個(gè)Object
    }
}

var a = _new(Super)(["z"])
a; //{name: "z"}

歡迎補(bǔ)充

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95673.html

相關(guān)文章

  • JavaScript深入淺出

    摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對方法,包括,,。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸耍虼宋闹兄豢炊?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...

    blair 評論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)于算法—線性表詳解

    摘要:前言通過前面數(shù)據(jù)結(jié)構(gòu)與算法前導(dǎo)我么知道了數(shù)據(jù)結(jié)構(gòu)的一些概念和重要性,那么我們今天總結(jié)下線性表相關(guān)的內(nèi)容?;窘Y(jié)構(gòu)對于線性表,我們只需要一個(gè)數(shù)組和就能表示基本信息。 前言 通過前面數(shù)據(jù)結(jié)構(gòu)與算法前導(dǎo)我么知道了數(shù)據(jù)結(jié)構(gòu)的一些概念和重要性,那么我們今天總結(jié)下線性表相關(guān)的內(nèi)容。當(dāng)然,我用自己的理解解分享給大家。 其實(shí)說實(shí)話,可能很多人依然分不清線性表,順序表,和鏈表之間的區(qū)別和聯(lián)系! 線性...

    Freelander 評論0 收藏0
  • JavaScript類型檢測詳解

    摘要:種原始類型對象屬性種原始類型中種原始類型為,,,,發(fā)現(xiàn)除外的其他種基本類型均可以用來識別因?yàn)闀?huì)得到,所以直接用來檢測對象的對象包括內(nèi)置對象,,等和自定義對象。其他檢測方法,都各有缺陷,不能精確。屬性檢測屬性是否在實(shí)例對象中應(yīng)該用。 本篇介紹一下如何檢測JavaScript各種類型。 ? 5種原始類型? 對象? Function? Array? 屬性 5種原...

    張金寶 評論0 收藏0
  • 2017文章總結(jié)

    摘要:歡迎來我的個(gè)人站點(diǎn)性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動(dòng)及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個(gè)優(yōu)化步驟進(jìn)階鵝廠大神用直出實(shí)現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補(bǔ)課緩存機(jī)制優(yōu)化動(dòng) 歡迎來我的個(gè)人站點(diǎn) 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動(dòng) scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...

    dailybird 評論0 收藏0

發(fā)表評論

0條評論

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