когда вызывается метод в цепочке прототипов объекта? - PullRequest
1 голос
/ 10 декабря 2011

Рассмотрим этот код ...

var org = {};

org.Organization = function() {

    var app = null;
    function setupApplication() {};

    return {
        init : function() {
            console.log("init");
        }
    }
};

org.Organization.prototype = {
    status : function() {
        console.log("status");
    }
};

var myOrg = new org.Organization();
myOrg.init();      // outputs "init"
myOrg.status();    // TypeError: Object #<Object> has no method 'status'

... метод status() не существует, и я не могу его вызвать :( Однако, если бы я удалил return { ... }, вот так ...

var org = {};

org.Organization = function() {

    var app = null;
    function setupApplication() {};
};

org.Organization.prototype = {
    status : function() {
        console.log("status");
    }
};

var myOrg = new org.Organization();
myOrg.init();      // TypeError: Object #<Object> has no method 'init
myOrg.status();    // outputs "status"

... тогда метод status() существует, и я могу вызвать его без проблем. Почему это происходит? Почему метод в цепочке прототипов может быть вызван, только если исходный объект не имеет return { ... }? return { ... } перезаписывает или имеет приоритет над методами в цепочке прототипов?

1 Ответ

4 голосов
/ 10 декабря 2011

Когда вы используете return obj в конструкторе функции, он возвращает тот фактический объект, а не объект, который был создан внутри.Если вы хотите, чтобы он работал правильно, просто определите init в конструкторе следующим образом:

this.init = function() { };

Чтобы дать еще несколько деталей: когда вы вызываете new Func, внутри происходит то, что новый объектсоздается прототип, установленный на прототип функции), и вызывается функция конструктора с объектом, установленным как this.В конце конструктора возвращается тот же объект, если только вы не вернете другой объект вручную, и в этом случае будет возвращен этот объект, который, очевидно, не будет иметь тот же прототип.

...