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

JavaScript原型鏈和instanceof運(yùn)算符的曖昧關(guān)系

開發(fā) 后端 前端
時(shí)間回到兩個(gè)月前,簡單地理了理原型鏈、prototype以及__proto__之間的亂七八糟的關(guān)系,同時(shí)也簡單了解了下typeof和instanceof兩個(gè)運(yùn)算符,但是,anyway,試試以下兩題:

時(shí)間回到兩個(gè)月前,簡單地理了理原型鏈、prototype以及__proto__之間的亂七八糟的關(guān)系,同時(shí)也簡單了解了下typeof和instanceof兩個(gè)運(yùn)算符,但是,anyway,試試以下兩題:

console.log(Function instanceof Function);
console.log(String
instanceof String);

如果無法得出準(zhǔn)確答案,跟著樓主一起溫故而知新吧。

溫故

我們經(jīng)常用typeof運(yùn)算符來判斷一個(gè)變量的類型,也確實(shí)挺好用,能判斷出number、boolean、string,但是對于 object的判斷能力一般,比如Array和null的判斷結(jié)果都是object,而且對于new的一些對象,比如new String(),new Number()等的結(jié)果都是object,這樣下來就有個(gè)問題,無法更細(xì)致地判斷對象實(shí)例,這時(shí)就需要instanceof出馬了。顧名思 義,instanceof是判斷一個(gè)對象是否為某一構(gòu)造函數(shù)實(shí)例的運(yùn)算符,這樣下來,對于new出來的變量,到底是number、string還是別的什 么玩意,就有了進(jìn)一步的判斷認(rèn)識了。看起來很簡單,其實(shí)不然,上面的兩題就是小試牛刀了,先放著,再來回顧下原型鏈。

JavaScript中一切皆為對象,所有對象都有個(gè)__proto__屬性值(即原型),可能某些坑爹瀏覽器下不支持,暫且不管,某對象的該 屬性的取值是該對象的構(gòu)造函數(shù)的prototype值,作用就是對于某一個(gè)類型的對象,不用重復(fù)定義某種方法,譬如說對于對象[1,2,3],顯然這是個(gè) 數(shù)組對象,它具有pop、push等方法,但是并不是說它本身就具有這些方法,而是它的構(gòu)造函數(shù)Array函數(shù)所具有,而該對象的__proto__取值 就是Array函數(shù)的prototype值,so如果本身并不具有pop方法,就會從它的__proto__中尋找,即所謂的原型鏈;而該條鏈的末端就是 Object,因?yàn)橐磺袑ο蠖际怯蒓bject構(gòu)造而成,而Object.prototype.__proto__規(guī)定指向null。

文字的描述永遠(yuǎn)是蒼白無力的,舉個(gè)簡單的例子:

  1. var fun = function(){ 
  2.   this.a = 1
  3. }; 
  4.   
  5. fun.prototype.b = 2
  6. var obj = new fun(); 
  7. obj.a; //1 
  8. obj.b; //2

 

 

網(wǎng)上盜的例子和圖,仔細(xì)看就會發(fā)現(xiàn)說的很清楚。

知新

接下來看看instanceof運(yùn)算符。

instanceof的常規(guī)用法是判斷a是否是b類型:

  1. console.log(true instanceof Boolean); // false  
  2. console.log(new Number(1instanceof Number); // true 

instanceof還能判斷父類型:

  1. function Father() {} function Child() {} Child.prototype = new Father(); var a = new Child(); console.log(a instanceof Child);  // true 
  2. console.log(a instanceof Father); // true 

Child構(gòu)造函數(shù)繼承自Father,實(shí)例a是Child構(gòu)造的無疑,但是為何也是Father的實(shí)例呢?其實(shí)instanceof運(yùn)算符的內(nèi)核可以簡單地用以下代碼描述:

  1. function check(a, b) {   while(a.__proto__) {     if(a.__proto__ === b.prototype)       return true;     a = a.__proto__;   }   return false; } function Foo() {} console.log(Object instanceof Object === check(Object, Object)); // true 
  2. console.log(Function instanceof Function === check(Function, Function)); // true 
  3. console.log(Number instanceof Number === check(Number, Number)); // true 
  4. console.log(String instanceof String === check(String, String)); // true 
  5. console.log(Function instanceof Object === check(Function, Object)); // true 
  6. console.log(Foo instanceof Function === check(Foo, Function)); // true 
  7. console.log(Foo instanceof Foo === check(Foo, Foo)); // true 

簡單地說,a如果是b的實(shí)例,那么a肯定能使用b的prototype中定義的方法和屬性,那么用代碼表示就是a的原型鏈中有b.prototype取值相同的對象,于是順著a的原型鏈一層層找就行了。

另外值得注意的是,String Number Boolean 以及Function等都是函數(shù),而函數(shù)則是統(tǒng)一由Function構(gòu)造而來的,so它們和任何單純的函數(shù)一樣,能用Function上的原型屬性:

  1. Function.prototype.a = 10; console.log(String.a);  // 10 

***來簡單講講最開始的兩道題吧。

  1. // 為了方便表述,首先區(qū)分左側(cè)表達(dá)式和右側(cè)表達(dá)式 
  2. FunctionL = Function, FunctionR = Function; // 下面根據(jù)規(guī)范逐步推演 
  3. O = FunctionR.prototype = Function.prototype L = FunctionL.__proto__ = Function.prototype // ***次判斷 
  4. O == L // 返回 true
  1. // 為了方便表述,首先區(qū)分左側(cè)表達(dá)式和右側(cè)表達(dá)式 
  2. StringL = String, StringR = String; // 下面根據(jù)規(guī)范逐步推演 
  3. O = StringR.prototype = String.prototype L = StringL.__proto__ = Function.prototype // ***次判斷 
  4. O != L // 循環(huán)再次查找 L 是否還有 __proto__ 
  5. L = String.prototype.__proto__ = Object.prototype // 第二次判斷 
  6. O != L // 再次循環(huán)查找 L 是否還有 __proto__ 
  7. L = String.prototype.__proto__ = null 
  8. // 第三次判斷 
  9. L == null 
  10. // 返回 false 

 

責(zé)任編輯:王雪燕 來源: 博客園
相關(guān)推薦

2010-03-15 16:41:21

無線標(biāo)準(zhǔn)WAPI

2020-12-10 08:11:52

typeof instanceofJS

2017-05-11 16:38:07

javascript邏輯運(yùn)算符

2020-02-20 14:00:15

JavaScript原型原型鏈

2023-04-10 08:58:13

C#關(guān)系運(yùn)算符

2009-08-12 13:35:22

C#關(guān)系運(yùn)算符

2021-05-07 06:27:29

JavaScript運(yùn)算符開發(fā)

2021-02-20 23:34:22

JavaScript運(yùn)算符開發(fā)

2015-08-06 15:25:44

prototypeconstructorjs

2010-10-08 09:17:07

JavaScript表JavaScript運(yùn)

2025-02-24 11:16:20

2009-06-21 13:48:05

ShellLinux運(yùn)算符

2012-11-08 10:40:47

JavaScript原型鏈

2021-07-12 15:35:56

JavaScript代碼運(yùn)算符

2020-10-20 08:35:34

JS基礎(chǔ)進(jìn)階

2009-08-11 15:51:08

C#運(yùn)算符算術(shù)運(yùn)算符

2012-01-05 15:07:11

JavaScript

2013-08-15 16:48:39

.Net基礎(chǔ)

2024-02-26 15:17:20

2023-08-28 07:12:54

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 日本久久精品视频 | 精品久久九九 | 欧美成人影院在线 | 亚洲精品中文在线 | 天堂一区二区三区 | 91国内精品久久 | 91精品国产91久久久久游泳池 | 欧美嘿咻 | www国产成人免费观看视频,深夜成人网 | 久久久不卡网国产精品一区 | 欧美极品在线视频 | 亚洲精品一区二区在线观看 | 99视频网站 | 日韩一级一区 | jvid精品资源在线观看 | 性一交一乱一伦视频免费观看 | 成人在线精品视频 | 一级毛片在线播放 | 自拍视频国产 | 国产精品一区二区欧美 | 伊人久久免费 | 中文字幕在线观看一区 | 久久久人成影片免费观看 | 亚洲精品国产电影 | 天天操人人干 | 中文在线亚洲 | 亚洲人成在线观看 | 精品伊人| 欧美不卡一区二区三区 | 亚洲精品一区二三区不卡 | 久久99精品国产 | 国产一区2区 | 日本精品网站 | 91国内视频在线 | 国产精品国产a级 | 操皮视频 | 欧美午夜精品理论片a级按摩 | 免费黄色a视频 | 免费午夜视频 | 国产精品一区二 | 国产免费一区二区三区 |