2014-03-30 64 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对象不是由这个构造函数

希望创建的对象的财产的财产这可以帮助你!