2014-03-30 86 views
1

我正在使用一個用於HTML5/CSS3/JS Web小部件遊戲的IIFE。爲此,我想創建專門的異常對象,它們是單個對象的後代。我在嘗試不可能的事情嗎?Javascript對象繼承與iife

到目前爲止的代碼是

window.Exception = (function(t) { 
    Exception.title = t; 
    Exception.msg = ''; 
    function Exception(message) { this.msg = message; } 
    Exception.prototype = { 
    toString: function() { return this.title + ': ' + this.msg; } 
    }; 
    return Exception; 
})('Exception'); 

window.RefException = (function(parent, t) { 
    RefException.title = t; 
    RefException.msg = ''; 
    function RefException(message) { this.msg = message; } 
    RefException.prototype = parent.prototype; 
    return RefException; 
})(window.Exception, 'Reference Exception'); 

console.log((new RefException('blah')).toString()); 

當我看在控制檯,我得到undefined: blah,所以RefException在繼承原型的功能,而不是命名空間的變量title。我錯過了什麼嗎?

回答

1

我似乎發現了問題,也有您的代碼2邏輯錯誤:
一些注意事項:
1. JavaScript有一個名爲Hoisting財產,這意味着在每塊變量或函數聲明提升到頂部由JS阻止。
2.在JS功能也是對象

現在,讓我們得到您的代碼片段開始:

window.Exception = (function(t) { 
    Exception.title = t; 
    Exception.msg = ''; 
    function Exception(message) { this.msg = message; } 
    Exception.prototype = { 
    toString: function() { return this.title + ': ' + this.msg; } 
    }; 
    return Exception; 
})('Exception'); 

這個片段是等於:

window.Exception = (function(t) { 
     function Exception(message) { this.msg = message; } // <-- Hoisted by JS 
     Exception.title = t; 
     Exception.msg = ''; 
     Exception.prototype = { 
     toString: function() { return this.title + ': ' + this.msg; } 
     }; 
     return Exception; 
    })('Exception'); 

現在,讓我們分析一下這個片段代碼:
- 您創建了一個名爲的函數類型的對象(不是類)異常
- 你已經添加了一些屬性,這個對象(如其它文字對象)命名冠軍味精
- 您分配一個文本對象,以Exception.prototype
- 最後返回對象異常這是一個具有一些附加屬性的簡單函數。

現在讓我們做一些測試這一功能:

var obj = new Exception(); 

這個聲明會發生什麼?

  1. 功能異常充當構造函數
  2. 一個新的對象將被創建並分配給this
  3. 命名msg新的屬性將被添加到該新創建的對象與消息變量的值將被分配給它
  4. 這個對象將從這個函數返回並分配給obj

現在,你能找到什麼問題嗎?
obj對象沒有命名的任何財產title
注意titleException對象不是由這個構造函數

希望創建的對象的財產的財產這可以幫助你!