代码之家  ›  专栏  ›  技术社区  ›  wheresrhys

为什么这个对象的原型的init函数不能运行

  •  1
  • wheresrhys  · 技术社区  · 14 年前

    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时,即使在SPZ.Puzzle中定义了in it函数,也没有定义它,我确保EditablePuzzle在Puzzle之后运行

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

    2 回复  |  直到 14 年前
        1
  •  0
  •   kfirbreger    14 年前

    我怀疑遗产设置得不好。试着做

    SPZ.EditablePuzzle.prototype = new SPZ.Puzzle;
    

    也许能解决这个问题,尽管我不确定。

        2
  •  0
  •   Ivo Wetzel    14 年前

    关于这个问题:

    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 它本身被分配给prototype属性,而实际上您希望这样做:

    FooBar.prototype = Foo.prototype
    

    看到区别了吗? 没有 init prototype 反对。