最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript創(chuàng)建對(duì)象的幾種方式及關(guān)于this指向問題

 更新時(shí)間:2022年07月22日 08:36:27   作者:? 一只小lemon?  
這篇文章主要介紹了JavaScript創(chuàng)建對(duì)象的幾種方式及關(guān)于this指向問題,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值。需要的小伙伴可以參考一下

工廠模式

工廠模式一般用于抽象創(chuàng)建特定對(duì)象的過程,是按照特定接口創(chuàng)建對(duì)象的方式。

function createPerson(name, age) {
    let o = {};
    o.name = name;
    0.age = age;
    o.study = function() {
        console.log(`${this.name} is studying`)
    }
    return o
}
const p1 = createPerson('張三', 18)
const p2 = createPerson('李四', 20)
p1.study() // 張三 is studying

值得一提的是,如果在 createPerson 函數(shù)中,o.study 改為箭頭函數(shù),那么打印的 this 會(huì)發(fā)生改變,這是因?yàn)榧^函數(shù)發(fā)生了 this 指向的問題。

工廠模式的優(yōu)點(diǎn): 在 createPerson 中,可以用不同的參數(shù)多次調(diào)用工廠函數(shù),每次都會(huì)返回包含特定參數(shù)和一個(gè)方法的對(duì)象??梢越鉀Q創(chuàng)建多個(gè)類似對(duì)象的問題。

工廠模式的缺點(diǎn):

  • 1. 沒有解決對(duì)象標(biāo)識(shí)問題。
  • 2. 每次創(chuàng)建對(duì)象,都會(huì)創(chuàng)建一個(gè)公共的方法,而方法也是對(duì)象,所以造成內(nèi)存浪費(fèi)。

構(gòu)造函數(shù)模式

在 JS 中, 構(gòu)造函數(shù)是用于創(chuàng)建特定類型對(duì)象的。像 Object、Array 這樣的原生構(gòu)造對(duì)象,運(yùn)行時(shí),可以直接在執(zhí)行環(huán)境中運(yùn)行。當(dāng)然也可以自定義構(gòu)造函數(shù),以函數(shù)的形式為自己的對(duì)象類型定義屬性和方法。

function Student(name, age) {
    this.name = name;
    this.age = age;
    this.study = function() {
        console.log(`${this.name} is studying`)
    }
}
const p1 = new Student('張三', 18)
const p2 = new Student('李四', 20)

通過上面的代碼,可以實(shí)現(xiàn)和工廠模式一樣的效果。但是值得注意的是: 如果這里的 study 函數(shù)變?yōu)榧^函數(shù), this 的指向是不會(huì)發(fā)生變化的。

如同上面的代碼,如果調(diào)用構(gòu)造函數(shù),就必須使用 new 關(guān)鍵字,在這個(gè)過程中,構(gòu)造函數(shù)會(huì)做四件事情:

  • 在內(nèi)存中創(chuàng)造一個(gè)新的對(duì)象
  • 將這個(gè)新的對(duì)象的隱式原型 __proto__ 賦值為該構(gòu)造函數(shù)的顯示原型 prototype
  • 構(gòu)造函數(shù)的內(nèi)部的 this 被賦值為這個(gè)新的對(duì)象(給新對(duì)象添加新的屬性)
  • 執(zhí)行構(gòu)造函數(shù)中的代碼,并且判斷有無對(duì)象返回值,如果存在,則返回這個(gè)返回值,否則返回這個(gè)新的對(duì)象
  • 構(gòu)造函數(shù)的優(yōu)缺點(diǎn): 首先,構(gòu)造函數(shù)解決了對(duì)象的標(biāo)識(shí)問題,但是如果構(gòu)造函數(shù)中存在著函數(shù),那么每次創(chuàng)建一個(gè)實(shí)例,就相當(dāng)于函數(shù)也被重新創(chuàng)造了一遍,因?yàn)樵贘S中函數(shù)也是相當(dāng)于對(duì)象,造成了對(duì)空間的浪費(fèi)。

關(guān)于 this

在標(biāo)準(zhǔn)函數(shù)中, this 引用的是把函數(shù)當(dāng)成方法調(diào)用的上下文對(duì)象,這個(gè)時(shí)候常稱其為 this。

我們?cè)谏衔恼f過,工廠模式和構(gòu)造函數(shù)模式,其內(nèi)部如果出現(xiàn)箭頭函數(shù),那么 this 的指向會(huì)出現(xiàn)不同,這是因?yàn)椋^函數(shù)中不存在 this , 箭頭函數(shù)中的 this會(huì)保留定義該函數(shù)的上下文,this 到底引用哪個(gè)對(duì)象必須到函數(shù)調(diào)用時(shí),才會(huì)確定, 在工廠模式時(shí), 雖然通過p1.study(),進(jìn)行調(diào)用,但是由于箭頭函數(shù)內(nèi)部沒有 this,所以向上查找,找到function createPerson 函數(shù), 綁定 window, 而在構(gòu)造函數(shù)模式中this 賦值給了這個(gè)新的對(duì)象,相當(dāng)于箭頭函數(shù)的this, 就是這個(gè)新的對(duì)象,也就是之后的實(shí)例。

可能,通過上面的描述,很多同學(xué)仍然對(duì)下面箭頭函數(shù)中的this,會(huì)保留定義該函數(shù)的上下文不太理解,我列舉一個(gè)例子。

// 工廠模式
function createPerson(name, age) {
    let o = {};
    o.name = name;
    o.age = age;
    o.study = () => {
        console.log(`${this.name} is studying`)
    }
    return o
}

const obj = {
    name: '張三'
}

const p1 = createPerson.call(obj, '李四', 20) // createPerson 綁定 obj, 那么箭頭函數(shù)也會(huì)綁定 obj
p1.study() // 所以這里的輸出是 張三 is studying,而不是 undefined

原型模式

每個(gè)函數(shù)都會(huì)創(chuàng)建一個(gè) prototype 屬性,這個(gè)屬性是一個(gè)對(duì)象,包含應(yīng)該由特定引用類型的實(shí)例共享的屬性和方法。實(shí)際上,這個(gè)對(duì)象就是通過調(diào)用構(gòu)造函數(shù)創(chuàng)建的對(duì)象的原型。使用原型對(duì)象的好處是,在它上面定義的屬性和方法可以被對(duì)象實(shí)例共享。原來在構(gòu)造函數(shù)中直接賦值給對(duì)象實(shí)例的值,可以直接賦值給他們的原型。

function Student() {}
Student.prototype.name = '張三';
Student.prototype.age = 20;
Student.prototype.friends = ['ls', 'ww'];
Student.prototype.study = function() {
    console.log(`${this.name} is studying`)
}

const p1 = new Student()
const p2 = new Student()

通過上面創(chuàng)建的p1, p2,共用了Student原型上的屬性,相當(dāng)于創(chuàng)造了兩個(gè)擁有相同屬性的不同對(duì)象。同理,如果上面的 study 改為了箭頭函數(shù),大家應(yīng)該也能知道 this 綁定的是誰了吧。(Tip: new 和 顯示綁定不可以同時(shí)使用)

原型模式的優(yōu)缺點(diǎn) : 首先原型模式解決了上兩種模式造成的空間浪費(fèi)問題,但是,其屬性都是共享的,所以一般來說,原型模式不會(huì)單獨(dú)去使用。

相關(guān)文章

  • javascript 瀏覽器類型和版本號(hào)檢測(cè)代碼(兼容多瀏覽器)

    javascript 瀏覽器類型和版本號(hào)檢測(cè)代碼(兼容多瀏覽器)

    果對(duì)javascript了解不是特別深入的話,很容易就會(huì)寫出不兼容的代碼(就像我),這時(shí)候就得判斷瀏覽器了。比如事件偵聽、一些鼠標(biāo)和鍵盤事件、Range等,一些都會(huì)不一樣.下面列出幾種常用的檢測(cè)瀏覽器方法,以饗觀眾!
    2010-04-04
  • JavaScript 程序編碼規(guī)范

    JavaScript 程序編碼規(guī)范

    這是一套適用于JavaScript程序的編碼規(guī)范。它基于Sun的Java程序編碼規(guī)范。但進(jìn)行了大幅度的修改, 因?yàn)镴avaScript不是Java。
    2010-11-11
  • JavaScript與ActionScript3兩者的同性與差異性

    JavaScript與ActionScript3兩者的同性與差異性

    接觸JavaScript和ActionScript3也有近5年的時(shí)間了,它們都是應(yīng)用比較廣泛的腳本語言.接下來通過本文給大家介紹JavaScript與ActionScript3兩者的同性與差異性,感興趣的朋友一起學(xué)習(xí)吧
    2016-09-09
  • JavaScript中切割截取字符串的7種方法

    JavaScript中切割截取字符串的7種方法

    在開發(fā)中常常會(huì)需要截取字符串,而 JavaScript 提供了很多種方法實(shí)現(xiàn)截取操作,本文主要介紹了JavaScript中切割截取字符串的7種方法,感興趣的可以了解一下
    2024-02-02
  • 用js的for循環(huán)獲取radio選中的值

    用js的for循環(huán)獲取radio選中的值

    獲取radio選中值的方法有很多,在本文為大家介紹的是使用for循環(huán)來實(shí)現(xiàn),具體的實(shí)現(xiàn)如下,感興趣的朋友可以參考下
    2013-10-10
  • JS 動(dòng)態(tài)獲取節(jié)點(diǎn)代碼innerHTML分析 [IE,FF]

    JS 動(dòng)態(tài)獲取節(jié)點(diǎn)代碼innerHTML分析 [IE,FF]

    在IE 環(huán)境下 賦值類型為對(duì)象時(shí) innerHTML 獲取不到其改變,在FireFox環(huán)境下 .屬性 方式獲取不到其改變。
    2009-11-11
  • js中call()和apply()改變指針問題的講解

    js中call()和apply()改變指針問題的講解

    今天小編就為大家分享一篇關(guān)于js中call()和apply()改變指針問題的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • JS調(diào)用CS里的帶參方法實(shí)例

    JS調(diào)用CS里的帶參方法實(shí)例

    js調(diào)用CS里的方法有很多,我用一種簡(jiǎn)單的方法,如下,有需要的朋友可以參考一下
    2013-08-08
  • bootstrapvalidator之API學(xué)習(xí)教程

    bootstrapvalidator之API學(xué)習(xí)教程

    這篇文章為大家分享了bootstrapvalidator之API學(xué)習(xí)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • javascript html5輕松實(shí)現(xiàn)拖動(dòng)功能

    javascript html5輕松實(shí)現(xiàn)拖動(dòng)功能

    這篇文章主要為大家詳細(xì)介紹了javascript html5輕松實(shí)現(xiàn)拖動(dòng)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評(píng)論

雷州市| 凤庆县| 阳泉市| 陵川县| 商都县| 桂林市| 闸北区| 文昌市| 江口县| 潞西市| 和顺县| 辽阳县| 张家川| 日喀则市| 元阳县| 河西区| 汽车| 时尚| 开阳县| 桐柏县| 吉林市| 南投市| 西城区| 广安市| 江陵县| 兰州市| 伽师县| 富川| 枣庄市| 双牌县| 云浮市| 资源县| 鱼台县| 宝清县| 南宁市| 鄯善县| 东城区| 崇义县| 宜春市| 永春县| 太和县|