1

我正在将 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: blahRefException继承原型函数也是如此,但不是命名空间变量title。我错过了什么吗?

4

1 回答 1

1

看来我找到了问题,您的代码中有两个逻辑错误:
一些注意事项:
1. JavaScript 有一个名为Hoisting的属性,这意味着块中的每个变量或函数声明都被 JS 提升到块的顶部。
2. JS中的functions也是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');

现在让我们分析一下这段代码: - 您创建了一个名为Exception
的函数类型的对象(不是类) - 您已向该对象(如其他文字对象)添加了一些属性,名为titlemsg - 您已将文字对象分配给Exception .prototype - 最后返回对象异常,这是一个带有一些附加属性的简单函数。


现在让我们用这个函数做一些测试:

var obj = new Exception();

这些陈述会发生什么?

  1. Function Exception充当构造函数
  2. 将创建一个新对象并将其分配给this
  3. 一个名为的新属性msg将被添加到这个新创建的对象中,并且消息变量的值将被分配给它
  4. 这个对象将从这个函数返回并分配给obj

现在,你能找到问题所在吗?
obj对象没有任何名为title
Notetitle的属性,它是Exception对象的属性,而不是由此构造函数创建的对象的属性

希望这对你有帮助!

于 2014-03-30T05:44:50.217 回答