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

时间:2010-10-20 10:52:58

标签: javascript inheritance prototype

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

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中定义,也没有定义init函数,我确保在Puzzle之后运行EditablePuzzle

为什么我的newObj函数找不到init函数?一旦它无法在对象本身中找到它,它是否应该自动查看原型?

2 个答案:

答案 0 :(得分:0)

关于这个问题:

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

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

答案 1 :(得分:0)

我怀疑遗传设置不好。尝试做

SPZ.EditablePuzzle.prototype = new SPZ.Puzzle;

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