一道考察JS new 以及 instanceof 的面試題

          摘要:一道面試題,考察 是否理解  new FunctionName 原理 以及 instanceof 的原理

          聲明:這道題目靈感來源淘寶UED部門玉伯的blog。

          (1) 關(guān)于 new

          大家對構(gòu)造函數(shù),估計都知道。 但是JavaScript 中的構(gòu)造函數(shù)是否跟你理解中的一模一樣呢?

          讓我們從一道面試題中,看原理:

          function Dog(name) {
              this.name = name;
              Dog.prototype = {
                  shout: function() { alert("I am " + this.name); }
              };
          }
          var dog1 = new Dog("Dog 1");
          var dog2 = new Dog("Dog 2");
          dog2.shout();
          dog1.shout();

          請問運行結(jié)果是什么?

          結(jié)果如果沒有出乎你的意料,建議不用在此浪費時間。

          如果覺得答案有點難理解請繼續(xù)……

          在執(zhí)行new 的時候,都做了什么:

          // var dog1 = new Dog() 的等價偽代碼:
          var dog1 = (function(name) {
              var o = {};
              o.__proto__ = Dog.prototype; // line 2
              Dog.call(o);
           dog1.name = name;
              Dog.prototype = {/* some code */}; // line 4
              return o; // line 5
          })();

          我沒做什么鋪墊,直接將new 的過程用偽代碼表示出來。發(fā)現(xiàn)在new 的過程也就是執(zhí)行構(gòu)造函數(shù)的時候做的事情是產(chǎn)生一個對象 并且是將原Dog 的prototype 繼承了過來。

          注意line 4 ,這個時候Dog的prototype 發(fā)生了改變。

          這導致了一個本質(zhì)的轉(zhuǎn)變: dog1 instanceof Dog 這將變?yōu)閒alse

          引出這道題目的第二個知識點考察。

          (2) 關(guān)于 instanceof
           
           
           結(jié)論:看隱藏的 dog1.__proto__ 屬性是否等于 Dog.prototype !
           
          看了這么多有趣的解釋是否試試手呢?

          好吧,讓我們看看下面的題目:(注意由于瀏覽器不同,javascript腳本引擎也不同,建議至少在firefox 或者 chrome 里面來看看,當然也順便用IE 不同版本看看)

          function Bird() {}
          var bird = {};
          bird.__proto__ = Bird.prototype;
          alert(bird instanceof Bird); // true or false?

          posted on 2010-10-11 00:28 -274°C 閱讀(338) 評論(0)  編輯  收藏 所屬分類: web前端

          常用鏈接

          留言簿(21)

          隨筆分類(265)

          隨筆檔案(242)

          相冊

          JAVA網(wǎng)站

          關(guān)注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 916110
          • 排名 - 40

          最新評論

          主站蜘蛛池模板: 松江区| 沈丘县| 营口市| 南部县| 郴州市| 溧阳市| 桂东县| 互助| 台前县| 左贡县| 南投县| 鄢陵县| 山阳县| 荃湾区| 大名县| 富裕县| 宝坻区| 渭源县| 昌吉市| 苗栗县| 团风县| 淮阳县| 金乡县| 太和县| 土默特右旗| 芜湖市| 囊谦县| 宜章县| 三都| 合山市| 高淳县| 丹巴县| 明水县| 兴宁市| 杂多县| 松阳县| 茂名市| 临夏县| 通化市| 谷城县| 陇南市|