【问题标题】:Why won't this object's prototype's init function run为什么这个对象的原型的 init 函数不会运行
【发布时间】:2010-10-20 10:52:57
【问题描述】:

我使用以下函数来创建新对象。

function newObj(o) {
 var params = Array.prototype.slice.call(arguments,1);
 function F() {}
 F.prototype = o;
 var obj = new F();
 if(params.length) {
  obj.init.apply(obj,params);
 }
 return obj;
} 

而且它在大多数情况下都运行良好。然而,我的一个基“类”现在被定义为从另一个基类继承

SPZ.EditablePuzzle = function () {
    // function and variable definitions

    return {
       ///some methods and properties
    }
}();

SPZ.EditablePuzzle.prototype = SPZ.Puzzle;

现在,当我使用 newObj() 创建新的 SPZ.EditablePuzzle 时,未定义 init 函数,即使它已在 SPZ.Puzzle 中定义,并且我确保 EditablePuzzle 在 Puzzle 之后运行

为什么我的 newObj 函数找不到 init 函数?它不应该在对象本身找不到原型时自动查找原型吗?

【问题讨论】:

    标签: javascript inheritance prototype


    【解决方案1】:

    我怀疑继承设置不正确。尝试做

    SPZ.EditablePuzzle.prototype = new SPZ.Puzzle;
    

    可能会解决这个问题,虽然我不确定。

    【讨论】:

      【解决方案2】:

      关于问题:

      function Foo() {
      }
      
      Foo.prototype.init = function() {
          console.log('bla');
      };
      
      
      function FooBar() {
      }
      
      FooBar.prototype = Foo; // looks fishy...
      
      var kitten = new FooBar();
      
      console.log(kitten.init); // yields undefined, uh what?
      

      问题是,在这种情况下,Foo 本身被分配给原型属性,而实际上你想要这样做:

      FooBar.prototype = Foo.prototype
      

      看到区别了吗? Foo 没有 init 属性,因为它是在 prototype 对象上定义的。

      【讨论】:

      • () 在那里,所以该函数被立即调用以返回对象。在我的情况下,我继承的对象确实具有 init 作为直接属性
      • 啊,是的,现在我明白了,抱歉,这里还有点早 ;)
      猜你喜欢
      • 2013-02-03
      • 2013-05-27
      • 2023-03-02
      • 2014-04-22
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多