我正在使用IIFE来制作HTML5 / CSS3 / 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.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
。我错过了什么吗?
答案 0 :(得分:1)
我似乎发现了问题,您的代码中有2个逻辑错误:
一些注意事项:
1. JavaScript有一个名为Hoisting的属性,它意味着块中的每个变量或函数声明都由JS提升到块的顶部。
2.在JS函数中也是Objects
现在让我们从代码片段开始:
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');
现在让我们分析一下这段代码:
- 创建名为异常的函数类型的Object(非类)
- 您已为此对象(如其他文字对象)添加了一些名为标题和 msg 的属性
- 您已将文字对象分配给 Exception.prototype
- 最后返回Object Exception ,这是一个带有一些附加属性的简单函数。
现在让我们用这个函数做一些测试:
var obj = new Exception();
这些陈述会怎样?
this
msg
的新属性,并为其分配消息变量的值obj
现在,你能找到问题吗?
obj
对象没有任何名为title
的属性
请注意title
是此构造函数创建的对象的Exception
对象 NOT 属性的属性
希望这能帮到你!