什么时候对象的原型链上的方法可以调用?

时间:2011-12-10 09:02:45

标签: javascript oop prototype-chain

考虑这段代码......

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 个答案:

答案 0 :(得分:4)

在函数构造函数中使用return obj时,它将返回该实际对象,而不是内部构造的对象。如果你想让它正常工作,只需在构造函数中定义init,如下所示:

this.init = function() { };

提供更多细节:当你调用new Func时,内部发生的是创建一个新对象(原型设置为函数的原型)并调用构造函数,并将对象设置为this。在构造函数的末尾,返回相同的对象,除非您手动返回另一个对象,在这种情况下将返回该对象,这显然不会具有相同的原型。