2014-09-02 52 views
0

我把下面的代碼放入封閉的編譯器在高級模式:關閉編譯器將忽略對象突變

var obj = (function() { 
    /** @constructor */ 
    function H(a) { 
    this.a = a 
    } 
    var h = new H(1); 
    h.b=1 
    return h 
})(); 

結果我得到的回覆是:

(function() { 
    var a = new function() { 
    }(1); 
    a.a = 1; 
    return a; 
})(); 

爲什麼不理我做出改變對象h.b=1

+1

嘗試在構造函數中添加'this.b = null'。也許它的優化方式是忽略會導致多個隱藏類的代碼? – plalx 2014-09-02 17:41:56

+0

@plalx我希望看到它添加'this.b = 1'到構造函數。 – qwertymk 2014-09-02 17:46:52

+0

儘管問題本身是有效的,但請注意[不應使用此模式](http://stackoverflow.com/q/10406552/1048572) – Bergi 2014-09-02 18:41:41

回答

1

的高級編譯選項使aggressive property removal,其中包括一些假設:

它叫上一個「原型」或定義的屬性很強的假設「this」將不會被遍歷,因此是去除的候選者。

/** @constructor */ function cls() { this.x = 1; // removal candidate due to "this" assumption; }

所以你看到的是實際被刪除this.a = a,然後物業b被重命名爲a