js中的new()到底作了些什麼?

要建立 Person 的新實例,必須使用 new 操做符。以這種方式調用構造函數實際上會經歷如下 4
個步驟:
(1) 建立一個新對象;
(2) 將構造函數的做用域賦給新對象(所以 this 就指向了這個新對象) ;
(3) 執行構造函數中的代碼(爲這個新對象添加屬性) ;
(4) 返回新對象。javascript

new 操做符

在有上面的基礎概念的介紹以後,在加上new操做符,咱們就能完成傳統面向對象的class + new的方式建立對象,在JavaScript中,咱們將這類方式成爲Pseudoclassical。
基於上面的例子,咱們執行以下代碼html

var obj = new Base();

這樣代碼的結果是什麼,咱們在Javascript引擎中看到的對象模型是:
java

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

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

第一行,咱們建立了一個空對象obj
第二行,咱們將這個空對象的__proto__成員指向了Base函數對象prototype成員對象
第三行,咱們將Base函數對象的this指針替換成obj,而後再調用Base函數,因而咱們就給obj對象賦值了一個id成員變量,這個成員變量的值是」base」,關於call函數的用法。this


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

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

那麼當咱們使用new建立一個新對象的時候,根據__proto__的特性,toString這個方法也能夠作新對象的方法被訪問到。因而咱們看到了:
構造子中,咱們來設置‘類’的成員變量(例如:例子中的id),構造子對象prototype中咱們來設置‘類’的公共方法。因而經過函數對象和Javascript特有的__proto__與prototype成員及new操做符,模擬出類和類實例化的效果。prototype

注:本文爲轉載文章[文章連接]指針

相關文章
相關標籤/搜索