考虑这段代码......
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 { ... }
是否覆盖或优先于原型链上的方法?
答案 0 :(得分:4)
在函数构造函数中使用return obj
时,它将返回该实际对象,而不是内部构造的对象。如果你想让它正常工作,只需在构造函数中定义init,如下所示:
this.init = function() { };
提供更多细节:当你调用new Func
时,内部发生的是创建一个新对象(原型设置为函数的原型)并调用构造函数,并将对象设置为this
。在构造函数的末尾,返回相同的对象,除非您手动返回另一个对象,在这种情况下将返回该对象,这显然不会具有相同的原型。