自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

涉及prototype,constructor和instanceof前端js面試難題

原創(chuàng)
移動(dòng)開(kāi)發(fā)
再來(lái)解釋instanceof,具體可以參考ECMAScript官方文檔和IBM 開(kāi)發(fā)者社區(qū)的解釋,簡(jiǎn)而言之,instanceof運(yùn)算符返回 A 的 prototype 對(duì)象是否存在 a 的原型鏈中。

提問(wèn)者:自己遇到的前端面試問(wèn)題,請(qǐng)高手來(lái)幫忙解決。其他的感興趣的同學(xué)也可以來(lái)看看,自己能不能答對(duì)。

  1. var A = function() {}; 
  2. A.prototype = {}; 
  3.  
  4. var B = {}; 
  5. console.log(A.constructor);//Function 
  6. console.log(B.constructor);//Object 
  7.  
  8.  
  9.  
  10. var a = new A(); 
  11. A.prototype = {}; 
  12.  
  13. var b = new A(); 
  14. b.constructor = A.constructor; 
  15. console.log(a.constructor == A);//false 
  16. console.log(a.constructor == b.constructor);//false 
  17. console.log(a instanceof A);//false 
  18. console.log(b instanceof A);//true 

小弟對(duì)***兩個(gè)console.log的結(jié)果不明白,我覺(jué)得應(yīng)該是

  1. console.log(a instanceof A);// true 
  2. console.log(b instanceof A);//true 

但是在瀏覽器中試過(guò)了,確實(shí)是上面的答案,求解,提前謝謝各位。

解答1:

首先說(shuō)明 instanceof 和 constructor 沒(méi)有半毛錢關(guān)系,所以題主的問(wèn)題有效代碼如下:

  1. var A = function() {}; 
  2. A.prototype = {};// 這里的空對(duì)象為對(duì)象1 
  3.  
  4. var a = new A(); 
  5. A.prototype = {};// 這里的空對(duì)象為對(duì)象2 
  6. var b = new A(); 
  7.  
  8. console.log(a instanceof A);//false 
  9. console.log(b instanceof A);//true 

特別注意我添加的兩個(gè)注釋,對(duì)象1和對(duì)象2并非同一個(gè)對(duì)象!

再來(lái)解釋instanceof,具體可以參考ECMAScript官方文檔和IBM 開(kāi)發(fā)者社區(qū)的解釋,簡(jiǎn)而言之,instanceof運(yùn)算符返回 A 的 prototype 對(duì)象是否存在 a 的原型鏈中。

那么上面代碼就可以用下面的圖示說(shuō)明:

可以看到,a 的原型鏈上已經(jīng)不存在 A 的 prototype 對(duì)象,因此console.log(a instanceof A);//false,而 b 的原型鏈上存在 A 的 prototype 對(duì)象,因此console.log(b instanceof A);//true

解答2:

1) a instancof A 檢查a的原型鏈中是否存在A.prototype

2)每一個(gè)js對(duì)象都有一個(gè)proto屬性(標(biāo)準(zhǔn)表示[[prototype]])

proto是普通對(duì)象的隱式屬性,在new的時(shí)候,會(huì)指向prototype所指的對(duì)象;new出來(lái)的對(duì)象是沒(méi)有prototype屬性的

proto實(shí)際上是某個(gè)對(duì)象的屬性,而prototype則是屬于構(gòu)造函數(shù)的屬性,prototype指向的是一個(gè)實(shí)體對(duì)象,也就是其有proto屬性;

通過(guò)proto屬性的串聯(lián)構(gòu)建了一個(gè)對(duì)象的原型訪問(wèn)鏈,起點(diǎn)為一個(gè)具體的對(duì)象,終點(diǎn)在Object.prototype,其proto( [[ prototype ]]) )為null

3)constrcutor 為對(duì)象的構(gòu)造函數(shù)對(duì)象,存在于prototype對(duì)象(原型對(duì)象)中,只要不對(duì)prototype對(duì)象重新復(fù)制,constructor都指向構(gòu)造函數(shù)自身

默認(rèn)的構(gòu)造函數(shù)為function object()

那么我們來(lái)分析下題目

  1. //和 function A(){} 相同,只不過(guò)原題通過(guò)匿名函數(shù)表達(dá)式的方式而非函數(shù)聲明的方式來(lái)生成一個(gè)函數(shù)對(duì)象 
  2. var A = function() {}; 
  3. A.prototype = {}; 
  4. //此時(shí)對(duì)構(gòu)造函數(shù)對(duì)象A的prototype屬性重新復(fù)制,constructor屬性不見(jiàn)了,此時(shí)  console.log(A.prototype.constructor == A);//false, console.log(A.prototype.constructor);// function Object() 
  5. //如果不執(zhí)行  A.prototype = {}; 那么 console.log(A.prototype.constructor == A);//true , console.log(A.prototype.constructor);// function A() 
  6. //為了和第2次出現(xiàn) A.prototype = {};有直觀的區(qū)別,我們添加以下語(yǔ)句 
  7. A.prototype = {first:'first'}; 
  8.  
  9. var B = {}; 
  10. console.log(A.constructor);//Function 函數(shù)的構(gòu)造函數(shù)為 function Function() 
  11. console.log(B.constructor);//Object 普通object的構(gòu)造函數(shù)為 function Object() 
  12.  
  13. var a = new A();//新建一個(gè)對(duì)象a, 
  14. //此時(shí)執(zhí)行  
  15. console.log(a.constructor);//function Object()  
  16. console.log(a.constructor==A);//false  
  17. console.log(a instanceof A);//true a.__proto__指向A構(gòu)造函數(shù)的prototype對(duì)象  Object {first: "first"} 
  18.  
  19. A.prototype = {};//修改構(gòu)造函數(shù)A的prototype屬性,與第1次出現(xiàn)有所區(qū)別,添加以下語(yǔ)句 
  20. A.prototype = {second:"second"};//此時(shí)的A構(gòu)造函數(shù)的prototype屬性值和定義A的時(shí)候就不同了 
  21. //這個(gè)時(shí)候我們?cè)僬{(diào)用 
  22. //console.log(a.constructor==A); 
  23. //console.log(a instanceof A); 
  24. // 會(huì)出現(xiàn)什么情況呢 
  25. console.log(a.constructor==A);//false 
  26.  
  27. console.log(a instanceof A);//false 
  28. console.log( a.__proto__ );//Object {first: "first"} 和 當(dāng)前A.prototype已經(jīng)不同了,也就是說(shuō)構(gòu)造函數(shù)prototype的變?cè)挷挥绊懸呀?jīng)創(chuàng)建的對(duì)象, 
  29. //這個(gè)道理和 var b=2,a=b;console.log(a); console.log(b); b=3; ;console.log(a); console.log(b);相同 
  30.  
  31. console.log(a.constructor);//function Object() 
  32. console.log(A.constructor);//function Function () 
  33.  
  34. var b = new A();//在新建一個(gè)對(duì)象B,在修改了的A.prototype的基礎(chǔ)上 
  35. console.log( b.__proto__ );//Object {second:"second"} 
  36.  
  37. b.constructor = A.constructor;//此時(shí)不會(huì)修改原型鏈上的constructor屬性,實(shí)在對(duì)象不上添加了一個(gè) 名為constructor的普通屬性,和原型上的constructor完全無(wú)關(guān) 
  38. //多說(shuō)一句,讀取屬性值或調(diào)用方法時(shí)會(huì)涉及到原型鏈上屬性的查找規(guī)則,設(shè)置屬性不適用,直接把屬性添加到b上 (會(huì)有些細(xì)小的不同,具體可參考你不知道的javascript P144 5.1.2) 
  39. // b.constructor 為 Function 
  40. console.log(a.constructor == A);//false  a.constructor 為 Object 
  41. console.log(a.constructor == b.constructor);//false   b.constructor 為 Function 
  42. // A.prototype -> {second:"second"}; 
  43. // b.__proto__ -> Object {second:"second"} 
  44. // a. __proto__ ->Object {first: "first"} 
  45. console.log(a instanceof A);//false  
  46. console.log(b instanceof A);//true 

解答3

.首先,instanceof 到底比較的什么?

instanceof 比較的是否能在實(shí)例的原型對(duì)象鏈中找到 與構(gòu)造函數(shù)(第二個(gè)參數(shù))的prototype屬性所指向的原型對(duì)象,能找到就返回true,反之false;

2. 方法A的原型被篡改為 Object (A.prototype = {})經(jīng)過(guò)這一步之后,

實(shí)例 a.[[proto]] = function A(){}.prototype !!//注意,此時(shí)這個(gè)加粗的prototype已經(jīng)變成了{(lán)}了!

而constructor是原型對(duì)象的屬性,所以 a.constructor == function Object(){} !!// {}根據(jù)自身的原型鏈找到

A.[[proto]] = function Function(){}.prototype //

A.constructor = function Function(){} //

顯然 A.constructor != a.constructor ;

下一個(gè)比較就同理了。

解答4

constructor是掛在prototype下的,當(dāng)A.prototype={}的時(shí)候,constructor被刪除了。所以a是false,而b又從新設(shè)置了constructor指向A,這時(shí)候b是true

責(zé)任編輯:chenqingxiang 來(lái)源: 網(wǎng)絡(luò)整理
相關(guān)推薦

2021-10-19 22:23:05

typeof方式Instanceof

2021-05-09 22:00:59

TypeofInstanceof運(yùn)算符

2016-08-03 17:23:47

javascripthtml前端

2009-07-08 17:51:45

constructor

2020-07-15 10:20:32

前端prototype__proto__

2020-08-26 14:20:24

prototype__proto__ 前端

2009-07-08 17:48:18

prototype屬性

2023-06-02 08:49:25

優(yōu)雅降級(jí)CSS3

2015-12-24 10:05:39

JavaScripttypeofinstanceof

2019-12-16 15:37:57

JavaScript人生第一份工作瀏覽器

2020-09-27 08:04:57

前端

2024-07-15 14:49:38

2010-10-09 09:26:59

Array數(shù)組JS

2021-09-06 13:12:05

前端JavaScript編程

2010-07-20 15:38:16

求職者

2020-12-10 08:11:52

typeof instanceofJS

2022-08-12 16:12:34

JavaScript數(shù)據(jù)類型字符串

2022-07-08 08:21:26

JSbind 方法

2021-10-20 18:44:43

編程對(duì)象JavaScript

2023-11-13 07:37:36

JS面試題線程
點(diǎn)贊
收藏

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