我正在尝试定义一个类,在其构造函数中实例化其他对象并向它们传递对自身的引用:
var Child = function(m) {
var mother = m;
return {
mother: mother
}
}
var Mother = function() {
var children = makeChildren();
return {
children: children
}
function makeChildren() {
var children = [];
for (var i = 0; i < 10; i++) {
var c = new Child(this); // <--- 'this' is an empty object here
children.push(c)
}
return children;
}
}
这不起作用,并且Child实例最终在mother
属性中有一个空对象。这样做的正确方法是什么?
答案 0 :(得分:4)
Javascript的this
不是词汇。这意味着makeChildren
获取了拥有 this
,而不是获得您想要的Mother
this
。
为此设置一个普通变量并改为使用它。
var that = this;
function makeChildren(){
blabla = that;
}
我不认为这样做是不够的。通过从构造函数返回一个对象,您忽略this
。把事情搞定:
this.children = children;
而不是返回一个新对象。
答案 1 :(得分:1)
当您从母对象中调用makeChildren()时,您可以尝试传递对母对象的引用,这样的事情可能是:
var Mother = function() {
var children = makeChildren(this);
}
然后makeChildren()函数可以接受引用作为参数,您可以使用它:
function makeChildren(ref)
var c = new Child(ref);
不知道这是否有效,但值得一试。
答案 2 :(得分:1)
嵌套函数不会从其父级继承this
,因此this
中的makeChildren()
与母版构造函数中的this
不同,除非您明确设置它在调用makeChildren()
:
var children = makeChildren.call(this);
这应该无需对代码进行任何进一步更改即可。看看more detail about .call()的MDN。
或者,您可以保存对this
的引用,并将其传递给函数:
var Mother = function() {
var self = this; // <-- new variable
var children = makeChildren();
return {
children: children
}
function makeChildren() {
var children = [];
for (var i = 0; i < 10; i++) {
var c = new Child(self); // <--- change 'this' to 'self'
children.push(c)
}
return children;
}
}
嵌套函数可以访问函数中的局部变量。
答案 3 :(得分:0)
var Child = function(m) {
var mother = m;
return {
mother: mother
}
};
var Mother = function() {
if (!(this instanceof Mother)) {
return new Mother();
}
var that = this;
var makeChildren = function() {
var children = [];
for (var i = 0; i < 10; i++) {
var c = new Child(that); // <--- 'that' is the reference to Mother
children.push(c)
}
return children;
};
var children = makeChildren();
return {
children: children
}
};
然后做:
var m = Mother();
Mother
对象中的前三行确保that
的值是Mother
实例,而不是全局对象。没有他们,你总是要写:
var m = new Mother();