<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          理解js中prototype和__proto__和的區別和作用?

          時間:?2017-11-28閱讀:?2318標簽:?js知識

          首先在講解prototype和__proto__和的區別和聯系之前,我們總結一下js中生成對象的方法:

          1.通過對象字面量創建對象:

          var person={
              name: 'tony',
              age: 27,
          }

          2.通過構造函數來創建對象:

          function Person() {
              //...
          }
          var person= new Person();


          3.由函數Object.create構造:

          var person={
              name: 'tony',
              age: 27,
          }
          var person1= Object.create(person);

          如果不使用Object.create函數,可以這樣做: 

          Object.create = function(p) {
              function f(){}
              f.prototype = p;
              return new f();
          }


          prototype顯式原型:

           Js的prototype屬性的解釋是:返回對象類型原型的引用。每個對象同樣也具有prototype屬性,除了Function.prototype.bind方法構造出來的函數對象是沒有prototype屬性,下面將做說明:

          function f(y,z){
              return this.x+y+z;
          }
          var m=f.bind({x:1},2); 
          console.log(m(3));//6
          //第一個實參綁定給f函數體內的 this,從第二個實參起,將依此傳遞給原始函數,因此 {x:1}傳遞給this ,2傳遞給形參y,m(3) 調用時的3 傳遞給形參z。
          console.log(f.prototype);//輸出原型上的屬性
          console.log(m.prototype===undefined);//true


          __proto__ 隱式原型  : 

          在js中有句話叫一切皆對象,而幾乎所有對象都具有__proto__屬性,可稱為隱式原型,除了Object.prototype這個對象的__proto__值為null。

          console.log(Object.prototype.__proto__);//輸出null

          __proto__大部分瀏覽器默認是支持,如果不支持我們可以通過S5的Object.getPrototypeOf()來獲取 ,所以:

          console.log(person.__proto__ === Object.getPrototypeOf(person));
          //輸出為true


          __proto__ 和prototype的聯系:

          如果對象不是由上述方法三的函數Object.create構造出來的,對象的__proto__屬性就是對象構造函數的prototype,所以:

          console.log(person.__proto__ === person.constructor.prototype);
          //輸出為true
          console.log(person1.__proto__ === person1.constructor.prototype);
          //輸出為false,由于person1是由Object.create構造出來的

          網上說的:隱式原型指向創建這個對象的函數(constructor)的prototype ,只適用于方法一和方法二創建的對象。

          1.所有的內建對象都是由Object()創建而來,內聯對象如:Array,Boolean,Date,Math,Number,String,RegExp,Global等,以Array為例:

          Array.prototype.__proto__ === Object.prototype //true

          所以在方法二中:

          function Person() {
              //...
          }
          var person= new Person();
          console.log(Person.prototype.__proto__ === Object.prototype);//返回true
          
          var p={};//p繼承Person
          p.prototype = person;
          console.log(p.prototype.__proto__ === Person.prototype);//返回true


          它們的作用:

          prototype顯式原型的作用:用來實現基于原型的繼承與屬性的共享。 

          __proto__隱式原型的作用:構成原型鏈,同樣用于實現基于原型的繼承。舉個例子,當我們訪問obj這個對象中的x屬性時,如果在obj中找不到,那么就會沿著__proto__依次查找。 


          instanceof  

          instanceof 操作符的內部實現機制和隱式原型、顯式原型有直接的關系。instanceof的左值一般是一個對象,右值一般是一個構造函數,用來判斷左值是否是右值的實例。它的內部實現原理是這樣的:
          //設 L instanceof R 
          //通過判斷
           L.__proto__.__proto__ ..... === R.prototype ?
          //最終返回true or false
          
          也就是沿著L的__proto__一直尋找到原型鏈末端,直到等于R.prototype為止。知道了這個也就知道為什么以下這些奇怪的表達式為什么會得到相應的值了
           Function instanceof Object // true 
           Object instanceof Function // true 
           Function instanceof Function //true
           Object instanceof Object // true
           Number instanceof Number //false

          站長推薦

          1.阿里云: 本站目前使用的是阿里云主機,安全/可靠/穩定。點擊領取2000元代金券、了解最新阿里云產品的各種優惠活動點擊進入

          2.騰訊云: 提供云服務器、云數據庫、云存儲、視頻與CDN、域名等服務。騰訊云各類產品的最新活動,優惠券領取點擊進入

          3.廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入

          鏈接: http://www.modern-decoration.com.cn/article/detial/189

          base91 for javascript

          原理和 base64 是一樣的,ASCII 共有94個可打印字符,base64 使用了其中 64 個,base91 使用了 91 個。

          javascript中什么是句柄?

          一個句柄是指使用的一個唯一的整數值,即一個4字節(64位程序中為8字節)長的數值,來標識應用程序中的不同對象和同類中的不同的實例。

          javascript不可變性是什么?

          不可變性即某個變量在進行了某個操作之后,其本身沒有發生變化,比如對于字符串而言,對字符串的任何操作都會改變字符串本身的值,而是在字符串的基礎上復制出來一個然后再改變,這樣我們就說是不可變的

          為什么javascript不起作用?

          JavaScript是一種屬于網絡的腳本語言,已經被廣泛用于Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實現自身的功能的。

          javascript怎么判斷按鈕被點擊?

          JavaScript可以通過Event對象的target事件或srcElement(IE瀏覽器支持)來判斷按鈕是否被點擊。Event對象代表事件的狀態,比如事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。

          javascript由幾部分組成?

          JavaScript有三部分組成。分別為核心(ECMAScript) 、文檔對象模型(DOM)、瀏覽器對象模型(BOM)。這三部分分別描述了該語言的語法和基本對象、處理網頁內容的方法和接口、與瀏覽器進行交互的方法和接口。

          Js輸出方式有哪些?

          在編寫JavaScript代碼的時候, 一定要記住每一句代碼后面都需要添加一個分號, 并且這個分號必須是英文的分號,我們會發現有時候不寫分號程序也能夠運行, 這里并不是因為不需要分號, 而是瀏覽器自動幫助我們添加了分號

          7個常見的 JavaScript 測驗及解答

          我相信學習新事物并評估我們所知的東西對自己的進步非常有用,可以避免了我們覺得自己的知識過時的情況。在本文中,我將介紹一些常見的 JavaScript 知識。請享用!

          JavaScript中“javascript:void(0) ”是什么意思

          expression 是一個要計算的 Javascript 標準的表達式。表達式外側的圓括號是可選的,鑒于規范化,以及養成好習慣,建議寫上去。當我們使用 void 操作符指定超級鏈接時,表達式會被計算但是不會在當前文檔處裝入任何內容。

          Js中constructor指向問題

          首先用一個例子指出來constructor存在形式。由上面的代碼我們總結出結論1:上面的代碼在控制臺可以看出constructor是指向構造器Fruit的引用。這個地方就有點奇怪了。這個constructor到底指向的是那個實例的構造器?

          內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權或違規,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全運營推廣

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网