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

資訊專欄INFORMATION COLUMN

沒有對(duì)象?new一個(gè)!

DataPipeline / 1097人閱讀

摘要:這是為什么呢原因是構(gòu)造函數(shù)中的并沒有指向當(dāng)前的新對(duì)象,此時(shí)方法就可完美解決這個(gè)問題方法也可,具體的的使用及與的異同可參照大神文章。

我們都知道,使用new后可返回一個(gè)對(duì)象,通常用于實(shí)例化一個(gè)“類”。
用法:

function Student (name, age) {
    this.name = name;
    this.age = age;
}
Student.prototype.sayName = function() {
    console.log("I am "+ this.name);
}
const person =new Student("小明");
person.sayName();  // I am 小明
問題分析

首先我們分析一下,手動(dòng)實(shí)現(xiàn)new需要什么。

創(chuàng)建一個(gè)函數(shù),可返回一個(gè)新的對(duì)象

需要訪問到Student構(gòu)造函數(shù)里的屬性

需要訪問到Student.prototype中的屬性和方法

具體步驟分析 一、參數(shù)傳遞

若要實(shí)現(xiàn)上面代碼的相同效果,首先明確需要一個(gè)“類”的參數(shù),以及其它參數(shù)(如name)。
js 的函數(shù)參數(shù)非常靈活,形參數(shù)量可不確定(使用...args),也可不給出。函數(shù)中有一個(gè) 與生俱來的arguments對(duì)象,具有length屬性,但不是數(shù)組,所以不可使用數(shù)組方法。

arguments 簡單分析

下述代碼中的輸出語句結(jié)果即為所傳實(shí)參的集合:

{ "0": [Function: Student], "1": "小明", "2": 18 }

function objectFactory() {
    console.log(arguments);
}
const person = objectFactory(Student, "小明",18);
二、方法實(shí)現(xiàn) 1.得到 Student 類的構(gòu)造函數(shù)

由前面 arguments 簡單分析可知,arguments中的第一個(gè)參數(shù)即為Student的構(gòu)造函數(shù)。上面說到,arguments 并非數(shù)組,那我們?nèi)绾蔚玫降谝豁?xiàng)呢?

兩種方法:[].shift.call(arguments)Array.from(arguments)

var Constructor = [].shift.call(arguments);
2.創(chuàng)建一個(gè)新的對(duì)象

創(chuàng)建一個(gè)新的對(duì)象非常簡單,如下:

const obj = new Object();
3.設(shè)置新對(duì)象的 __proto__ 屬性

__proto__是對(duì)象的私有屬性,指向構(gòu)造該對(duì)象的構(gòu)造函數(shù)的原型。所以此步須將新的對(duì)象的此屬性指向 Constructor的原型。

obj.__proto__ = Constructor.prototype;
4.得到構(gòu)造函數(shù)上的 this 屬性

若要實(shí)例化一個(gè)“類”,則必須調(diào)用其構(gòu)造函數(shù),在執(zhí)行構(gòu)造函數(shù)時(shí),其 this的值是動(dòng)態(tài)的變化的,即為當(dāng)前調(diào)用該函數(shù)的對(duì)象。

可是這里有個(gè)問題,若此時(shí)直接調(diào)用構(gòu)造函數(shù)并傳值

Constructor(arguments);

最終結(jié)果將為undefined。

這是為什么呢?

原因是構(gòu)造函數(shù)中的 this并沒有指向當(dāng)前的新對(duì)象,此時(shí)apply()方法就可完美解決這個(gè)問題(call()方法也可),具體的apply()的使用及apply()call()的異同可參照大神文章。

結(jié)果:

function objectFactory(){
    var Constructor = [].shift.call(arguments);
    var obj = new Object();
    obj.__proto__ = Constructor.prototype;
    Constructor.apply(obj, arguments);
    return obj;
}

const person = objectFactory(Student, "小明", 18);
person.sayName();   // I am 小明
結(jié)束

對(duì)于手動(dòng)實(shí)現(xiàn)new的學(xué)習(xí),原型的概念更清晰了,在具體的實(shí)現(xiàn)過程中也學(xué)習(xí)到了shift、call、apply等方法的一些使用。收獲頗豐。

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

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

相關(guān)文章

  • JavaScript 工廠函數(shù) vs 構(gòu)造函數(shù)

    摘要:當(dāng)談到語言與其他編程語言相比時(shí),你可能會(huì)聽到一些令人困惑東西,其中之一是工廠函數(shù)和構(gòu)造函數(shù)。好的,讓我們用構(gòu)造函數(shù)做同樣的實(shí)驗(yàn)。當(dāng)我們使用工廠函數(shù)創(chuàng)建對(duì)象時(shí),它的指向,而當(dāng)從構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),它指向它的構(gòu)造函數(shù)原型對(duì)象。 showImg(https://segmentfault.com/img/bVbr58T?w=1600&h=900); 當(dāng)談到JavaScript語言與其他編程語言...

    RayKr 評(píng)論0 收藏0
  • javascript創(chuàng)建對(duì)象

    摘要:就是通過調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。與寄生構(gòu)造函數(shù)模式類似,使用穩(wěn)妥構(gòu)造函數(shù)模式創(chuàng)建的對(duì)象與構(gòu)造函數(shù)之間也沒有什么關(guān)系,因此操作符對(duì)這種對(duì)象也沒有什么意義 雖然Object構(gòu)造函數(shù)或?qū)ο笞置媪慷伎梢杂脕韯?chuàng)建單個(gè)對(duì)象,但是這些方法有明顯的缺點(diǎn):使用同一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量重復(fù)代碼。因此人們開始使用工廠模式。 工廠模式 這種模式抽象了創(chuàng)建具體對(duì)象的過程 funct...

    Keven 評(píng)論0 收藏0
  • 面向對(duì)象的小九九

    摘要:由構(gòu)造函數(shù)返回的對(duì)象就是表達(dá)式的結(jié)果。如果構(gòu)造函數(shù)沒有顯式返回一個(gè)對(duì)象,則使用步驟創(chuàng)建的對(duì)象。運(yùn)算符返回一個(gè)布爾值,表示對(duì)象是否為某個(gè)構(gòu)造函數(shù)的實(shí)例。 面向?qū)ο?本人能力有限,有誤請(qǐng)斧正 本文旨在復(fù)習(xí)面向?qū)ο?不包含es6) 本文學(xué)習(xí)思維 創(chuàng)建對(duì)象的方式,獲取對(duì)象屬性 構(gòu)造函數(shù),構(gòu)造函數(shù)的new 做了什么 原型與原型對(duì)象 原型鏈 繼承(借用構(gòu)造繼承、原型繼承、組合繼承、寄生組合繼承)...

    時(shí)飛 評(píng)論0 收藏0
  • 理解js對(duì)象

    摘要:將構(gòu)造函數(shù)的作用域賦值給新對(duì)象因此指向了新對(duì)象執(zhí)行構(gòu)造函數(shù)的代碼為這個(gè)新對(duì)象添加屬性返回對(duì)象最初是用來標(biāo)識(shí)對(duì)象類型的。但提到檢測對(duì)象類型,還是使用將構(gòu)造函數(shù)當(dāng)作函數(shù)構(gòu)造函數(shù)與其他函數(shù)唯一區(qū)別。 創(chuàng)建對(duì)象 雖然Object構(gòu)造函數(shù)與對(duì)象字面量都能創(chuàng)建單個(gè)對(duì)象, 但這些方式都有明顯的缺點(diǎn): 使用同一個(gè)接口創(chuàng)建很多對(duì)象, 會(huì)產(chǎn)生大量重復(fù)代碼。 var obj = {}; //對(duì)象字面量 va...

    zhouzhou 評(píng)論0 收藏0
  • 【9】JavaScript 面向對(duì)象高級(jí)——對(duì)象創(chuàng)建模式

    摘要:解決了構(gòu)造函數(shù)模式不能共享方法的問題。六寄生構(gòu)造模式流程創(chuàng)建一個(gè)構(gòu)造函數(shù),在這個(gè)函數(shù)內(nèi)部創(chuàng)建一個(gè)對(duì)象,用返回對(duì)象。除了使用操作符并把使用的包裝函數(shù)叫做構(gòu)造函數(shù)以外,這個(gè)模式與工程模式其實(shí)是一模一樣的。 JavaScript面向?qū)ο蟾呒?jí)——對(duì)象創(chuàng)建模式 一、工廠模式 流程: 定義一個(gè)函數(shù),函數(shù)返回對(duì)象。 適用場景: 需要?jiǎng)?chuàng)建多個(gè)對(duì)象,都是Object類型。 優(yōu)點(diǎn):完成了返回一個(gè)對(duì)象的...

    linkin 評(píng)論0 收藏0
  • Java引用類型分析

    摘要:強(qiáng)引用是使用最普遍的引用,它是默認(rèn)的引用類型,不需要顯式聲明,在中沒有實(shí)際的類對(duì)應(yīng),可以把它理解為的內(nèi)置省略默認(rèn)引用類型。相同點(diǎn)當(dāng)執(zhí)行時(shí),兩者引用的對(duì)象都會(huì)被回收。這時(shí)已經(jīng)無法獲得引用的對(duì)象,并且對(duì)象被放入了。 概述 java.lang.ref 類庫包含一組類,為垃圾回收提供了更大的靈活性。 java.lang.ref 有三個(gè)繼承自抽象類 Reference 的類: showImg(h...

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

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

0條評(píng)論

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