理解js中的new

來源:互聯網
上載者:User

標籤:替換   文章   pac   函數對象   cell   ref   string   ret   設定   

 

new 操作符

在有上面的基礎概念的介紹之後,在加上new操作符,我們就能完成傳統物件導向的class + new的方式建立對象,在Javascript中,我們將這類方式成為Pseudoclassical。
基於上面的例子,我們執行如下代碼

 

  var obj = new Base();
 

這樣代碼的結果是什麼,我們在Javascript引擎中看到的物件模型是:

new操作符具體幹了什麼呢?其實很簡單,就幹了三件事情。

 

  var obj  = {};obj.__proto__ = Base.prototype;Base.call(obj);
 

第一行,我們建立了一個Null 物件obj
第二行,我們將這個Null 物件的__proto__成員指向了Base函數對象prototype成員對象
第三行,我們將Base函數對象的this指標替換成obj,然後再調用Base函數,於是我們就給obj對象賦值了一個id成員變數,這個成員變數的值是”base”,關於call函數的用法,請參看陳皓《Javascript 物件導向編程》文章

 


如果我們給Base.prototype的對象添加一些函數會有什麼效果呢?
例如代碼如下:

 

  Base.prototype.toString = function() {    return this.id;}
 

那麼當我們使用new建立一個新對象的時候,根據__proto__的特性,toString這個方法也可以做新對象的方法被訪問到。於是我們看到了:
構造子中,我們來設定‘類’的成員變數(例如:例子中的id),構造子物件prototype中我們來設定‘類’的公用方法。於是通過函數對象和Javascript特有的__proto__與prototype成員及new操作符,類比出類和類執行個體化的效果。

理解js中的new

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.