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

深入理解New操作符

開發 前端
眼尖的開發者可能已經發現我們的構造函數中返回了一個字符串,它是屬于基本類型,如果我們返回一個對象會發生什么?

前言

當我們對函數進行實例化時,需要用new操作符來實現。那么,對于它的底層實現原理你是否清楚呢?

原理分析

我們通過一個具體的例子來看下一個函數在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關鍵字將Person函數進行實例化,我們發現實例化后,可以訪問到:

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

圖片

眼尖的開發者可能已經發現我們的構造函數中返回了一個字符串,它是屬于基本類型,如果我們返回一個對象會發生什么?

function Person(name, age) {

return {
bodyWeight: this.bodyWeight
};
}

再次運行代碼后,我們發現:

只能訪問我們在構造函數中所返回的屬性。

構造函數中聲明的其它屬性以及掛載在原型上的屬性均無法訪問。

圖片

實現思路

經過前面的分析,我們知道了函數在new完之后會返回一個新的對象,這個對象上掛載了構造函數內的所有屬性以及函數原型上的所有屬性。

我們在實現的時候,也需要建立一個新的對象,這個對象上需要包含構造函數里的屬性,因此我們可以使用apply方法來給此對象添加新屬性。

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

有了這些知識點作為鋪墊后,我們就可以寫出這個模擬函數了,如下所示:

  • 創建一個對象用來存儲構造函數的屬性
  • 從arguments中取出第一個參數,這個參數便是調用時的構造函數
  • 將新對象的原型通過__proto__?指向構造函數的prototype
  • 通過apply方法改變構造函數的this指向,從而實現將構造函數內部的屬性添加進新創建的對象中
  • 判斷構造函數是否有返回值

有返回值且其類型為一個對象或者一個函數,則返回構造函數的返回值

否則就返回我們新創建的對象

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;
}

測試用例

我們用原理分析中的例子來驗證下我們實現的這個工廠函數能否正確執行。

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

假設函數沒有返回值或者返回值是一個字符串類型時,執行結果如下所示:

圖片

當函數的返回值是一個對象時,執行結果如下所示:

圖片

責任編輯:武曉燕 來源: 神奇的程序員
相關推薦

2020-12-26 16:51:12

Python操作符開發

2023-10-27 11:27:14

Go函數

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數據結構hash函數

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數據庫命令

2019-06-25 10:32:19

UDP編程通信

2017-01-10 08:48:21

2024-02-21 21:14:20

編程語言開發Golang

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-08-15 13:05:58

Serverless架構開發運維

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原型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91网在线播放 | 一级h片 | 黄色免费网站在线看 | 欧美黄视频 | 网黄在线 | 国产精品亚洲精品久久 | 人人射人人插 | 亚洲视屏 | 国产成人av电影 | 亚洲一区二区三区在线播放 | 欧美日韩精品一区二区三区视频 | 九九热在线视频免费观看 | h视频免费在线观看 | 亚洲精品电影在线观看 | www.操.com | 在线观看亚洲 | 一级免费毛片 | 日韩一级二级片 | 欧美一级大片免费看 | 国产9999精品 | 欧美日韩视频在线第一区 | 欧美一区二区另类 | 国产欧美久久一区二区三区 | 免费h在线 | 国产成人精品久久二区二区91 | 久久久久国产一区二区三区四区 | 国产精品美女在线观看 | a看片 | 蜜月va乱码一区二区三区 | 毛片一区二区三区 | www.久草.com | 91欧美| 久久久久久亚洲精品 | 亚洲国产成人一区二区 | h片免费看 | 一区日韩 | 亚洲一区二区在线视频 | 精品久久亚洲 | 国产精品一区二区在线免费观看 | 国产美女视频黄 | 久久精品欧美一区二区三区不卡 |