摘要:這是為什么呢原因是構造函數中的并沒有指向當前的新對象,此時方法就可完美解決這個問題方法也可,具體的的使用及與的異同可參照大神文章。
我們都知道,使用new后可返回一個對象,通常用于實例化一個“類”。
用法:
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 小明問題分析
首先我們分析一下,手動實現new需要什么。
創建一個函數,可返回一個新的對象
需要訪問到Student構造函數里的屬性
需要訪問到Student.prototype中的屬性和方法
具體步驟分析 一、參數傳遞若要實現上面代碼的相同效果,首先明確需要一個“類”的參數,以及其它參數(如name)。
js 的函數參數非常靈活,形參數量可不確定(使用...args),也可不給出。函數中有一個 與生俱來的arguments對象,具有length屬性,但不是數組,所以不可使用數組方法。
下述代碼中的輸出語句結果即為所傳實參的集合:
{ "0": [Function: Student], "1": "小明", "2": 18 }
function objectFactory() { console.log(arguments); } const person = objectFactory(Student, "小明",18);二、方法實現 1.得到 Student 類的構造函數
由前面 arguments 簡單分析可知,arguments中的第一個參數即為Student的構造函數。上面說到,arguments 并非數組,那我們如何得到第一項呢?
兩種方法:[].shift.call(arguments) 或 Array.from(arguments)
var Constructor = [].shift.call(arguments);2.創建一個新的對象
創建一個新的對象非常簡單,如下:
const obj = new Object();3.設置新對象的 __proto__ 屬性
__proto__是對象的私有屬性,指向構造該對象的構造函數的原型。所以此步須將新的對象的此屬性指向 Constructor的原型。
obj.__proto__ = Constructor.prototype;4.得到構造函數上的 this 屬性
若要實例化一個“類”,則必須調用其構造函數,在執行構造函數時,其 this的值是動態的變化的,即為當前調用該函數的對象。
可是這里有個問題,若此時直接調用構造函數并傳值
Constructor(arguments);
最終結果將為undefined。
這是為什么呢?
原因是構造函數中的 this并沒有指向當前的新對象,此時apply()方法就可完美解決這個問題(call()方法也可),具體的apply()的使用及apply()與call()的異同可參照大神文章。
結果:
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 小明結束
對于手動實現new的學習,原型的概念更清晰了,在具體的實現過程中也學習到了shift、call、apply等方法的一些使用。收獲頗豐。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95414.html
摘要:當談到語言與其他編程語言相比時,你可能會聽到一些令人困惑東西,其中之一是工廠函數和構造函數。好的,讓我們用構造函數做同樣的實驗。當我們使用工廠函數創建對象時,它的指向,而當從構造函數創建對象時,它指向它的構造函數原型對象。 showImg(https://segmentfault.com/img/bVbr58T?w=1600&h=900); 當談到JavaScript語言與其他編程語言...
摘要:就是通過調用構造函數而創建的那個對象實例的原型對象。與寄生構造函數模式類似,使用穩妥構造函數模式創建的對象與構造函數之間也沒有什么關系,因此操作符對這種對象也沒有什么意義 雖然Object構造函數或對象字面量都可以用來創建單個對象,但是這些方法有明顯的缺點:使用同一個接口創建很多對象,會產生大量重復代碼。因此人們開始使用工廠模式。 工廠模式 這種模式抽象了創建具體對象的過程 funct...
摘要:解決了構造函數模式不能共享方法的問題。六寄生構造模式流程創建一個構造函數,在這個函數內部創建一個對象,用返回對象。除了使用操作符并把使用的包裝函數叫做構造函數以外,這個模式與工程模式其實是一模一樣的。 JavaScript面向對象高級——對象創建模式 一、工廠模式 流程: 定義一個函數,函數返回對象。 適用場景: 需要創建多個對象,都是Object類型。 優點:完成了返回一個對象的...
摘要:強引用是使用最普遍的引用,它是默認的引用類型,不需要顯式聲明,在中沒有實際的類對應,可以把它理解為的內置省略默認引用類型。相同點當執行時,兩者引用的對象都會被回收。這時已經無法獲得引用的對象,并且對象被放入了。 概述 java.lang.ref 類庫包含一組類,為垃圾回收提供了更大的靈活性。 java.lang.ref 有三個繼承自抽象類 Reference 的類: showImg(h...
閱讀 1186·2023-04-25 17:05
閱讀 3011·2021-11-19 09:40
閱讀 3545·2021-11-18 10:02
閱讀 1740·2021-09-23 11:45
閱讀 3022·2021-08-20 09:36
閱讀 2783·2021-08-13 15:07
閱讀 1133·2019-08-30 15:55
閱讀 2459·2019-08-30 14:11