摘要:這是為什么呢原因是構(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ù)組方法。
下述代碼中的輸出語句結(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
摘要:當(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語言與其他編程語言...
摘要:就是通過調(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...
摘要:由構(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)造繼承、原型繼承、組合繼承、寄生組合繼承)...
摘要:將構(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...
摘要:解決了構(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ì)象的...
摘要:強(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...
閱讀 1199·2023-04-25 17:05
閱讀 3024·2021-11-19 09:40
閱讀 3579·2021-11-18 10:02
閱讀 1752·2021-09-23 11:45
閱讀 3035·2021-08-20 09:36
閱讀 2795·2021-08-13 15:07
閱讀 1145·2019-08-30 15:55
閱讀 2476·2019-08-30 14:11