精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解JS中new調用函數原理

開發 前端
JavaScript 中經常使用構造函數創建對象(通過 new 操作符調用一個函數),那在使用 new 調用一個函數的時候到底發生了什么?先看幾個例子,再解釋背后發生了什么。

[[235817]]

JavaScript 中經常使用構造函數創建對象(通過 new 操作符調用一個函數),那在使用 new 調用一個函數的時候到底發生了什么?先看幾個例子,再解釋背后發生了什么。

一、看三個例子

1.1 無 return 語句

構造函數***沒有 return 語句,這也是使用構造函數時默認情況,***會返回一個新對象,如下:

 

  1. function Foo(age) {  
  2.   this.age = age;  
  3.   
  4.  
  5. var o = new Foo(111);  
  6. console.log(o); 

這是常見的使用構造函數創建對象的過程,打印出來的是 {age: 111}。

1.2 return 對象類型數據

構造函數*** return 對象類型數據:

 

  1. function Foo(age) { 
  2.   this.age = age; 
  3.   return { type: "我是顯式返回的" }; 
  4.  
  5. var o = new Foo(222); 
  6. console.log(o); 

打印出來的是 {type: '我是顯式返回的'},也就是說,return 之前的工作都白做了,***返回 return 后面的對象。

1.3 return 基本類型數據

那是不是只要構造函數體內***有 return,返回都是 return 后面的數據呢?

我們看下返回基本類型數據的情況:

 

  1. function Foo(age) {  
  2.   this.age = age;  
  3.  
  4.   return 1;  
  5.  
  6.  
  7. var o = new Foo(333);  
  8. console.log(o); 

打印出來的是 {age: 333},和沒有 return 時效果一樣。跟預期不一樣,背后你原理看下面分析。

二、背后原理

2.1 非箭頭函數的情況

當使用 new 操作符創建對象是,ES5 官方文檔在 函數定義 一節中做了如下定義 13.2.2 [[Construct]]:

 

  1. When the [[Construct]] internal method for a Function object F is called with a possibly empty list of arguments, the following steps are taken:  
  2.  
  3.     Let obj be a newly created native ECMAScript object.  
  4.     Set all the internal methods of obj as specified in 8.12.  
  5.     Set the [[Class]] internal property of obj to Object.  
  6.     Set the [[Extensible]] internal property of obj to true 
  7.     Let proto be the value of calling the [[Get]] internal property of F with argument "prototype" 
  8.     If Type(proto) is Object, set the [[Prototype]] internal property of obj to proto.  
  9.     If Type(proto) is not Object, set the [[Prototype]] internal property of obj to the standard built-in Object prototype object as described in 15.2.4.  
  10.     Let result be the result of calling the [[Call]] internal property of F, providing obj as the this value and providing the argument list passed into [[Construct]] as args.  
  11.     If Type(result) is Object then return result.  
  12.     Return obj. 

看第 8、9 步:

    8)調用函數 F,將其返回值賦給 result;其中,F 執行時的實參為傳遞給 [[Construct]](即 F 本身) 的參數,F 內部 this 指向 obj;

    9)如果 result 是 Object 類型,返回 result;

這也就解釋了如果構造函數顯式返回對象類型,則直接返回這個對象,而不是返回最開始創建的對象。

***在看第 10 步:

    10)如果 F 返回的不是對象類型(第 9 步不成立),則返回創建的對象 obj。

如果構造函數沒有顯式返回對象類型(顯式返回基本數據類型或者直接不返回),則返回最開始創建的對象。

2.2 箭頭函數的情況

那如果構造函數是箭頭函數怎么辦?

箭頭函數中沒有 [[Construct]] 方法,不能使用 new 調用,會報錯。

NOTICE:其中 [[Construct]] 就是指構造函數本身。

    相關規范在 ES6 的官方文檔 中有提,但自從 ES6 以來的官方文檔巨難懂,在此不做表述。

三、new 調用函數完整過程

3.1 中文描述及相關代碼分析

除了箭頭函數之外的任何函數,都可以使用 new 進行調用,背后發生了什么,上節英文講述的很清楚了,再用中文描述如下:

1)創建 ECMAScript 原生對象 obj;

2)給 obj 設置原生對象的內部屬性;(和原型屬性不同,內部屬性表示為 [[PropertyName]],兩個方括號包裹屬性名,并且屬性名大寫,比如常見 [[Prototype]]、[[Constructor]])

3)設置 obj 的內部屬性 [[Class]] 為 Object;

4)設置 obj 的內部屬性 [[Extensible]] 為 true;

5)將 proto 的值設置為 F 的 prototype 屬性值;

6)如果 proto 是對象類型,則設置 obj 的內部屬性 [[Prototype]] 值為 proto;(進行原型鏈關聯,實現繼承的關鍵)

7)如果 proto 是不對象類型,則設置 obj 的內部屬性 [[Prototype]] 值為內建構造函數 Object 的 prototype 值;(函數 prototype 屬性可以被改寫,如果改成非對象類型,obj 的 [[Prototype]] 就指向 Object 的原型對象)

8)9)10)見上節分析。(決定返回什么)

對于第 7 步的情況,見下面代碼:

 

  1. function Foo(name) {  
  2.   this.name = name 
  3.  
  4.  
  5. var o1 = new Foo("xiaoming");  
  6. console.log(o1.__proto__ === Foo.prototype); // true  
  7.  
  8.  
  9. // 重寫構造函數原型屬性為非對象類型,實例內部 [[Prototype]] 屬性指向 Object 原型對象  
  10. // 因為實例是一個對象類型的數據,默認會繼承內建對象的原型,  
  11. // 如果構造函數的原型不滿足形成原型鏈的要求,那就跳過直接和內建對象原型關聯  
  12. Foo.prototype = 1;  
  13. var o2 = new Foo("xiaohong");  
  14. console.log(o2.__proto__ === Foo.prototype); // false  
  15. console.log(o2.__proto__ === Object.prototype); // true 

3.2 更簡潔的語言描述

若執行 new Foo(),過程如下:

1)創建新對象 o;

2)給新對象的內部屬性賦值,關鍵是給[[Prototype]]屬性賦值,構造原型鏈(如果構造函數的原型是 Object 類型,則指向構造函數的原型;不然指向 Object 對象的原型);

3)執行函數 Foo,執行過程中內部 this 指向新創建的對象 o;

4)如果 Foo 內部顯式返回對象類型數據,則,返回該數據,執行結束;不然返回新創建的對象 o。

四、幾點說明

4.1 判斷是否是 Object 類型

關于一個數據是否是 Object 類型,可以通過 instanceof 操作符進行判斷:如果 x instanceof Object 返回 true,則 x 為 Object 類型。

由上可知,null instanceof Object 返回 false,所以 null 不是 Object 類型,盡管typeof null 返回 "Object"。

4.2 instanceof 原理

instanceof 的工作原理是:在表達式 x instanceof Foo 中,如果 Foo 的原型(即 Foo.prototype)出現在 x 的原型鏈中,則返回 true,不然,返回 false。

因為函數的原型可以被改寫,所以會出現在 x 通過 Foo new 出來之后完全改寫 Foo 的原型 x instanceof Foo 返回 false 的情況。因為實例創建之后重寫構造函數原型,實例指向的原型已經不是構造函數的新的原型了,見下面代碼:

 

  1. const Foo = function() {};  
  2. const o = new Foo();  
  3. o instanceof Foo; // true  
  4. // 重寫 Foo 原型  
  5. Foo.prototype = {};  
  6. o instanceof Foo; // false  

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2015-07-10 10:34:57

JSPatchJS調用

2015-07-10 10:40:29

JSPatchOCJS

2011-08-22 17:13:00

LuaC++函數

2017-03-12 19:51:38

js實用跨域

2011-06-28 13:12:07

Qt 調用 DLL DLL

2009-07-03 17:33:06

JSP中調用JavaB

2023-10-23 19:27:21

Go函數

2010-09-08 14:03:41

SQL函數CONVERT

2023-05-31 11:57:38

js函數計算高度

2021-09-06 13:12:05

前端JavaScript編程

2016-09-26 17:15:51

2017-01-13 15:45:05

Linuxfork函數詳解

2010-09-06 14:58:42

SQL函數

2010-09-09 11:12:49

SQL函數DATALENGTH

2010-10-09 10:30:03

JS event

2023-10-27 11:27:14

Go函數

2022-06-09 08:17:30

Python__new__

2012-04-16 13:47:37

JavaMatlab

2017-07-27 15:52:10

函數調用堆棧結構

2010-09-10 16:02:13

SQLCHARINDEX函數
點贊
收藏

51CTO技術棧公眾號

国产一区二区三区精品视频| 精品一区不卡| 五月婷婷综合激情| 欧美一区1区三区3区公司 | 在线 丝袜 欧美 日韩 制服| 韩国成人在线| 一区二区三区欧美视频| 久久riav二区三区| 91黄色在线视频| 亚洲黄页一区| 色偷偷91综合久久噜噜| 国产a级黄色片| 精品美女一区| 午夜精品一区二区三区免费视频 | 亚洲大片av| 日日骚av一区| 人妻丰满熟妇av无码久久洗澡 | 麻豆网站免费在线观看| 国产精品蜜臀在线观看| 久草精品电影| 国产福利视频导航| 日本免费在线视频不卡一不卡二| 欧美精品久久一区二区| 女人18毛片毛片毛片毛片区二| 高清欧美性猛交xxxx黑人猛| 欧美日韩国产一级二级| 无码aⅴ精品一区二区三区浪潮 | av av在线| 亚洲电影二区| 色婷婷国产精品久久包臀 | 久久成人精品| 欧美激情极品视频| 欧美一级特黄高清视频| re久久精品视频| 亚洲欧美国产精品va在线观看| 岛国大片在线免费观看| 91国产精品| 欧美日韩一二三区| 国产精品亚洲a| 三妻四妾完整版在线观看电视剧| 亚洲一区二区视频| 超级碰在线观看| 毛片免费不卡| 国产欧美视频在线观看| 久久青青草综合| 无码精品人妻一区二区| 高清不卡在线观看av| 91免费看网站| 精品人妻一区二区三区日产乱码| 精品一区二区三区在线观看| 国产欧美日韩精品在线观看| 日韩欧美一级大片| 奇米影视一区二区三区| 国产精品免费一区豆花| 老熟妇一区二区三区啪啪| 久久电影一区| 国产精品欧美激情| 在线观看亚洲国产| 男男视频亚洲欧美| 国产欧美精品日韩精品| 国产精品老熟女视频一区二区| 精品一区二区三区蜜桃| 成人黄色av网站| www.色日本| 成人一区在线观看| 久久久7777| 极品美乳网红视频免费在线观看| 国产视频一区在线播放| 亚洲精品久久区二区三区蜜桃臀| а天堂8中文最新版在线官网| 中文字幕av免费专区久久| 吴梦梦av在线| 国产丝袜视频在线播放| 欧美性猛交xxxx黑人猛交| 国产一区视频免费观看| 24小时成人在线视频| 精品国产乱码久久久久久图片| 老司机免费视频| 欧美少妇性xxxx| 中文字幕日韩在线播放| 婷婷色中文字幕| 日韩午夜一区| 国产精品青草久久久久福利99| 亚洲天堂手机在线| 国产成人av一区二区三区在线观看| 国产精品日韩欧美一区二区三区| 天堂а在线中文在线无限看推荐| 日本一二三四高清不卡| www.九色.com| 日本欧美不卡| 欧美成人三级电影在线| 大又大又粗又硬又爽少妇毛片| 手机在线电影一区| 午夜精品一区二区三区在线| 中文字幕免费高清网站| 国产精品一区二区果冻传媒| 久久综合九色99| caopen在线视频| 色综合天天综合色综合av| 日韩av福利在线观看| 伊人久久大香线蕉无限次| 久久精品电影网| 亚洲 日本 欧美 中文幕| 国产精品一区二区三区99| 秋霞久久久久久一区二区| 亚洲大胆人体大胆做受1| 色哟哟日韩精品| 国产成人精品一区二区三区在线观看 | 色av综合在线| 真实乱偷全部视频| 超碰成人久久| 欧美一性一乱一交一视频| 国产农村妇女毛片精品| 国产夜色精品一区二区av| 日本黄色片一级片| 国产成人77亚洲精品www| 亚洲精品99999| 校园春色 亚洲| 九九**精品视频免费播放| 蜜桃av噜噜一区二区三区| 羞羞的网站在线观看| 欧美日韩在线亚洲一区蜜芽| 成人午夜福利一区二区| 亚洲国产一区二区三区a毛片| 国产日韩欧美电影在线观看| 你懂的在线播放| 午夜欧美大尺度福利影院在线看 | **国产精品| 在线视频免费一区二区| 欧美日韩综合在线观看| 成人美女视频在线观看18| 国风产精品一区二区| 日韩成人精品一区二区三区| 亚洲色图17p| 国产三级av片| 91麻豆免费观看| 日本韩国欧美在线观看| 嗯用力啊快一点好舒服小柔久久| 欧美成年人网站| 国产精品视频无码| 一区在线观看视频| 欧美视频国产视频| 91精品综合久久久久久久久久久 | 欧美在线xxx| 日韩福利一区二区| 欧美性精品220| 国产特级黄色录像| 天堂久久久久va久久久久| 欧美日韩天天操| 成人看片网页| 日韩在线资源网| 国产乱淫av免费| 亚洲男人电影天堂| 亚洲成人激情小说| 亚洲精品男同| 欧美成人在线免费观看| 亚洲成人激情社区| 日韩在线观看免费全集电视剧网站| 亚洲熟妇无码久久精品| 亚洲女厕所小便bbb| 免费看91视频| 国产精品婷婷| 日韩欧美三级电影| 日韩伦理一区二区| 欧美成人手机在线| 亚洲av成人精品毛片| 在线亚洲一区二区| 97精品在线播放| 国产一本一道久久香蕉| 日韩国产一级片| 九九精品在线| 成人免费福利视频| 黄污视频在线观看| 精品中文字幕久久久久久| 无码人妻精品一区二区三区蜜桃91| 国产人成亚洲第一网站在线播放| 天天干天天av| 99在线精品免费视频九九视 | 亚洲高清影视| 国产伦精品一区二区三区四区免费 | 欧美日韩精品一区二区在线播放| 少妇aaaaa| av一区二区三区| 免费涩涩18网站入口| 欧美不卡高清| 欧美日韩国产免费一区二区三区| 亚洲国产天堂| 97视频在线观看网址| 成人av一区| 精品99一区二区三区| 欧美一区免费看| 一区二区三区四区高清精品免费观看| 中文字幕一区二区三区人妻不卡| 精品一区二区久久| 久久精品国产精品亚洲色婷婷| 99精品在线观看| 国产精品一区二区你懂得| yw.尤物在线精品视频| 欧美—级a级欧美特级ar全黄| 国产精品一区在线看| 精品国产乱码久久久久久图片| 中文永久免费观看| 欧美日韩国产黄| 欧美成欧美va| 国产精品免费久久| 日韩人妻一区二区三区| 国产a视频精品免费观看| 日本xxxx黄色| 性色一区二区三区| 黄色一级片国产| 欧美3p视频| 日韩电影免费观看在| 国产精品sss在线观看av| 国产日韩专区在线| 日韩中文影院| 欧美最猛性xxxx| av美女在线观看| 欧美国产日韩一区二区三区| 日韩在线观看www| 亚洲色图综合久久| 天天干天天操av| 欧美成人女星排行榜| 国产精品乱码一区二区| 欧美撒尿777hd撒尿| 欧美 日韩 精品| 亚洲成av人在线观看| 青青草成人免费| 日韩久久一区二区| 黄色国产在线播放| 欧美国产成人在线| 成人免费无遮挡无码黄漫视频| 91丨porny丨首页| 男男做爰猛烈叫床爽爽小说 | 欧美日韩午夜在线| 精人妻无码一区二区三区| 欧美性高潮床叫视频| 日韩精品在线免费视频| 性做久久久久久久免费看| 久久国产露脸精品国产| 亚洲综合清纯丝袜自拍| 国产亚洲欧美精品久久久www | 99国产精品国产精品毛片| 国产免费无码一区二区| 国产精品91xxx| 中文字幕人妻熟女人妻a片| 国产传媒欧美日韩成人| 亚洲国产综合av| 国产精品中文欧美| 成人做爰69片免费| av一区二区三区黑人| 亚洲第九十七页| 久久精品男人天堂av| av永久免费观看| 中文字幕亚洲在| www.色小姐com| 亚洲一区二区三区四区在线免费观看 | 欧美黄在线观看| 4444亚洲人成无码网在线观看| 欧美午夜精品| 欧美极品欧美精品欧美| 美女网站久久| 一起操在线视频| 国产精品18久久久久久久网站| 中文字幕18页| 26uuu国产日韩综合| 国产又粗又猛又爽又黄的视频四季| 国产精品美女久久久久aⅴ国产馆| 国产精品精品软件男同| 一区二区三区在线观看视频 | 性欧美精品高清| 艹b视频在线观看| 国产乱码一区二区三区| 国产精品久久AV无码| 国产日韩欧美一区二区三区乱码 | 一本一道久久综合狠狠老精东影业| 国产视频一视频二| 肉色丝袜一区二区| 性生活一级大片| 91免费视频网| 五月婷婷六月香| 亚洲一区二区三区美女| 无码视频在线观看| 日韩一区二区三免费高清| 亚州精品国产精品乱码不99按摩| 国产一区二区三区精品久久久| 91精选在线| 日本午夜在线亚洲.国产| 一区二区三区日本视频| 精品91免费| 欧美高清视频手机在在线| 成年人午夜视频在线观看| 免费成人美女在线观看.| 日韩大尺度视频| 欧美激情综合在线| 久久久久无码国产精品不卡| 在线观看亚洲a| 亚洲精选一区二区三区| 在线视频精品一| 欧美gv在线| 亚洲最大成人网色| 欧美日韩高清| www.av蜜桃| 国产一区欧美一区| 91久久免费视频| 亚洲国产人成综合网站| 中文字幕一区二区三区四区视频 | 欧美小视频在线| 精品人妻一区二区三区浪潮在线| 伊人久久久久久久久久| av资源在线| 91中文字幕在线观看| 欧美综合在线视频观看 | 美女脱光内衣内裤视频久久影院| 日韩女优在线视频| 亚洲人成伊人成综合网小说| 久久久精品毛片| 亚洲精品www久久久| 欧美xxxx免费虐| 成人午夜激情网| 日韩系列欧美系列| 午夜免费一区二区| 91美女片黄在线观看91美女| 久久久久久久久精| 69p69国产精品| av男人的天堂在线| 国产精品扒开腿爽爽爽视频| 日本精品在线播放 | 黄色网页在线免费看| 国产精品99久久久久久久久| 色婷婷av一区二区三区丝袜美腿| 激情五月婷婷六月| 韩国av一区二区三区在线观看| 国产精品成人无码免费| 色噜噜久久综合| 久久天堂电影| 日本久久久久亚洲中字幕| 女仆av观看一区| 日日碰狠狠添天天爽超碰97| 成人动漫一区二区三区| 国产午夜视频在线播放| 日韩精品一区二区三区在线| av免费看在线| 懂色av一区二区三区在线播放| 91精品99| 久久久久亚洲av无码网站| 一区二区久久久久| 俄罗斯嫩小性bbwbbw| 国外成人性视频| 久久悠悠精品综合网| 拔插拔插海外华人免费| 成人永久免费视频| 久久久久久久久影院| 日韩成人久久久| 亚洲天堂电影| 少妇特黄a一区二区三区| 欧美aa在线视频| 亚洲女人久久久| 欧美一级二级三级蜜桃| 成人免费高清观看| 欧美极品一区| 蜜臀av性久久久久av蜜臀妖精| 麻豆网址在线观看| 欧美v日韩v国产v| 欧美激情网站| 亚洲福利av在线| 国产精品综合av一区二区国产馆| 国产精品第72页| 亚洲天堂av女优| 999精品视频在线观看| 91成人综合网| 久久久精品黄色| 国产视频在线一区| 高清欧美性猛交xxxx| 国产精品一区二区av日韩在线| 日韩欧美亚洲另类| 亚洲国产aⅴ天堂久久| 九一在线视频| 97久草视频| 丝袜美腿亚洲综合| 成人观看免费视频| 亚洲精品日韩在线| 国模大尺度视频一区二区| 亚洲午夜无码av毛片久久| 国产精品乱人伦一区二区| 亚洲va天堂va欧美ⅴa在线| 欧洲成人在线视频| 欧美在线日韩| av男人的天堂av| 欧美不卡在线视频| 亚洲www啪成人一区二区| 日本黄xxxxxxxxx100| 久久久美女毛片| 精品国产乱码一区二区三| 欧美最猛性xxxxx免费| 在线成人激情| 免费看污片网站| 欧美精品一区二区不卡| 久久人人视频| 久久精品视频16| 亚洲黄色av一区|