1. 程式人生 > >js中的new關鍵字都幹了些什麼?

js中的new關鍵字都幹了些什麼?

new 操作符

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

  var obj = new Base();  

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

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

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

第一行,我們建立了一個空物件obj
第二行,我們將這個空物件的__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操作符,模擬出類和類例項化的效果。

http://www.07net01.com/program/2016/02/1262322.html