成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入理解New操作符

開發(fā) 前端
眼尖的開發(fā)者可能已經(jīng)發(fā)現(xiàn)我們的構(gòu)造函數(shù)中返回了一個(gè)字符串,它是屬于基本類型,如果我們返回一個(gè)對象會發(fā)生什么?

前言

當(dāng)我們對函數(shù)進(jìn)行實(shí)例化時(shí),需要用new操作符來實(shí)現(xiàn)。那么,對于它的底層實(shí)現(xiàn)原理你是否清楚呢?

原理分析

我們通過一個(gè)具體的例子來看下一個(gè)函數(shù)在new之后都能做些什么,如下所示:

function Person(name, age) {
this.name = name;
this.age = age;
this.height = "175cm";
this.bodyWeight = "65kg";
return "some anything";
}


Person.prototype.dailyExercise = "300 kcal";
Person.prototype.printBodyWeight = function() {
console.log(this.name + "體重為: " + this.bodyWeight);
};

接下來,我們用new關(guān)鍵字將Person函數(shù)進(jìn)行實(shí)例化,我們發(fā)現(xiàn)實(shí)例化后,可以訪問到:

  • 函數(shù)內(nèi)部的屬性
  • 函數(shù)原型上的屬性
const person = new Person("神奇的程序員", "22");
console.log(person.age);
console.log(person.bodyWeight);
console.log(person.dailyExercise);
person.printBodyWeight();

圖片

眼尖的開發(fā)者可能已經(jīng)發(fā)現(xiàn)我們的構(gòu)造函數(shù)中返回了一個(gè)字符串,它是屬于基本類型,如果我們返回一個(gè)對象會發(fā)生什么?

function Person(name, age) {

return {
bodyWeight: this.bodyWeight
};
}

再次運(yùn)行代碼后,我們發(fā)現(xiàn):

只能訪問我們在構(gòu)造函數(shù)中所返回的屬性。

構(gòu)造函數(shù)中聲明的其它屬性以及掛載在原型上的屬性均無法訪問。

圖片

實(shí)現(xiàn)思路

經(jīng)過前面的分析,我們知道了函數(shù)在new完之后會返回一個(gè)新的對象,這個(gè)對象上掛載了構(gòu)造函數(shù)內(nèi)的所有屬性以及函數(shù)原型上的所有屬性。

我們在實(shí)現(xiàn)的時(shí)候,也需要建立一個(gè)新的對象,這個(gè)對象上需要包含構(gòu)造函數(shù)里的屬性,因此我們可以使用apply方法來給此對象添加新屬性。

在深入理解原型鏈與繼承文章中,我們知道實(shí)例的 __proto__?屬性會指向構(gòu)造函數(shù)的prototype,建立起這樣的關(guān)系后,實(shí)例才可以訪問原型上的屬性。

有了這些知識點(diǎn)作為鋪墊后,我們就可以寫出這個(gè)模擬函數(shù)了,如下所示:

  • 創(chuàng)建一個(gè)對象用來存儲構(gòu)造函數(shù)的屬性
  • 從arguments中取出第一個(gè)參數(shù),這個(gè)參數(shù)便是調(diào)用時(shí)的構(gòu)造函數(shù)
  • 將新對象的原型通過__proto__?指向構(gòu)造函數(shù)的prototype
  • 通過apply方法改變構(gòu)造函數(shù)的this指向,從而實(shí)現(xiàn)將構(gòu)造函數(shù)內(nèi)部的屬性添加進(jìn)新創(chuàng)建的對象中
  • 判斷構(gòu)造函數(shù)是否有返回值

有返回值且其類型為一個(gè)對象或者一個(gè)函數(shù),則返回構(gòu)造函數(shù)的返回值

否則就返回我們新創(chuàng)建的對象

function instantiateFactory() {
const obj = {};

const Constructor = [].shift.call(arguments);

obj.__proto__ = Constructor.prototype;

const result = Constructor.apply(obj, arguments);

if (result && (typeof result == "object" || typeof result == "function")) {
return result;
}

return obj;
}

測試用例

我們用原理分析中的例子來驗(yàn)證下我們實(shí)現(xiàn)的這個(gè)工廠函數(shù)能否正確執(zhí)行。

const factory = instantiateFactory(Person, "神奇的程序員", "22");
console.log(factory.age);
console.log(factory.bodyWeight);
console.log(factory.dailyExercise);
factory.printBodyWeight();

假設(shè)函數(shù)沒有返回值或者返回值是一個(gè)字符串類型時(shí),執(zhí)行結(jié)果如下所示:

圖片

當(dāng)函數(shù)的返回值是一個(gè)對象時(shí),執(zhí)行結(jié)果如下所示:

圖片

責(zé)任編輯:武曉燕 來源: 神奇的程序員
相關(guān)推薦

2020-12-26 16:51:12

Python操作符開發(fā)

2023-10-27 11:27:14

Go函數(shù)

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2020-07-21 08:26:08

SpringSecurity過濾器

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis

2009-09-25 09:14:35

Hibernate日志

2013-09-22 14:57:19

AtWood

2020-09-23 10:00:26

Redis數(shù)據(jù)庫命令

2019-06-25 10:32:19

UDP編程通信

2017-01-10 08:48:21

2024-02-21 21:14:20

編程語言開發(fā)Golang

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-08-15 13:05:58

Serverless架構(gòu)開發(fā)運(yùn)維

2025-06-05 05:51:33

2021-10-31 18:59:55

Python操作符用法

2010-07-14 14:55:07

Perl操作符

2009-08-19 17:26:28

C# 操作符

2015-11-04 09:57:18

JavaScript原型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 超级乱淫av片免费播放 | 国产9 9在线 | 中文 | 中文字幕视频在线 | 欧美视频第二页 | 免费黄色在线观看 | 精品久久久久久亚洲精品 | 亚洲精品久久久久avwww潮水 | 欧美a区 | 淫片一级国产 | 密室大逃脱第六季大神版在线观看 | 亚洲成人精品一区 | gav成人免费播放视频 | 精品国产乱码久久久久久88av | 一区二区三区在线免费观看 | av首页在线 | 亚洲欧美成人在线 | 日韩在线免费播放 | 国产精品欧美精品日韩精品 | 欧美寡妇偷汉性猛交 | 日韩av免费看 | 99精品热视频 | 欧美日韩亚洲一区 | 中文福利视频 | 亚洲成人免费 | 蜜桃视频在线观看免费视频网站www | 久久久久久国产精品免费免费狐狸 | 免费在线观看成年人视频 | 99精品国产一区二区青青牛奶 | 99国产欧美 | 久久久国产一区二区三区 | 免费国产一区二区视频 | 毛片久久久 | 四虎最新 | 91视频大全 | 中文字幕一区二区三区不卡 | 久久久久久影院 | 亚洲一区二区三区免费在线 | 一区二区三区日 | 欧美一级欧美三级在线观看 | 中文字幕av网站 | 久久久久久高清 |