我定义了一个Parent对象,我希望它有一个具有自己的函数和私有变量的子成员对象。为了封装函数和变量,我将一个自执行的匿名函数添加到Parent原型中。
以下是展示问题的代码:
var Parent = function() {
this.memberVariable = 'hello world';
}
Parent.prototype.doSomething = function() {
return this.childObject.doSomething();
};
Parent.prototype.childObject = function() {
// instead of being Parent, `this` is the Window object. What is the best way to fix this?
var that = this;
return {
doSomething: function() {
// undefined, but should be 'hello world'
return that.memberVariable;
}
}
}();
var parent = new Parent();
console.log(parent.doSomething());

我有一个解决方法是将父作用域传递给子函数,但这看起来很奇怪,似乎必须有更好的解决方案:
var Parent = function() {
this.memberVariable = 'hello world';
}
Parent.prototype.doSomething = function() {
// we pass in `this`
return this.childObject.doSomething(this);
};
Parent.prototype.childObject = function() {
return {
doSomething: function(that) {
return that.memberVariable;
}
}
}();
var parent = new Parent();
console.log(parent.doSomething());

有没有更好的方法来实现这一目标?
答案 0 :(得分:4)
在childObject
构造函数中初始化Parent
。否则,Parent
的所有实例都将共享相同的childObject
。这可能不是你想要的。
function Parent() {
this.childObject = new Child(this); // or something like makeChild(parent), or just an object literal.
}
function Child(parent) {
this.parent = parent;
}
答案 1 :(得分:0)