Jife对象继承与iife

时间:2014-03-30 04:14:27

标签: javascript inheritance iife

我正在使用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。我错过了什么吗?

1 个答案:

答案 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();

这些陈述会怎样?

  1. 函数异常充当构造函数
  2. 将创建一个新对象并将其分配给this
  3. 将为此新创建的对象添加名为msg的新属性,并为其分配消息变量的值
  4. 此对象将从此函数返回并分配给obj
  5. 现在,你能找到问题吗? obj对象没有任何名为title的属性 请注意title是此构造函数创建的对象的Exception对象 NOT 属性的属性

    希望这能帮到你!