Почему не запускается функция init этого прототипа - PullRequest
1 голос
/ 20 октября 2010

Я использую следующую функцию для создания новых объектов.

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? Разве он не должен автоматически смотреть на прототип, как только он не может найти его в самом объекте?

Ответы [ 2 ]

0 голосов
/ 20 октября 2010

Я подозреваю, что наследование не установлено.попробуйте сделать

SPZ.EditablePuzzle.prototype = new SPZ.Puzzle;

Может решить эту проблему, хотя я не уверен.

0 голосов
/ 20 октября 2010

По поводу проблемы:

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.

...