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