Javascript 对构造函数中当前对象的引用
我试图定义一个类,该类在其构造函数中实例化其他对象并将引用传递给自身:Javascript 对构造函数中当前对象的引用,javascript,Javascript,我试图定义一个类,该类在其构造函数中实例化其他对象并将引用传递给自身: var Child = function(m) { var mother = m; return { mother: mother } } var Mother = function() { var children = makeChildren(); return { children: children } function makeChildren() { v
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;
}
}
var Child=函数(m){
var=m;
返回{
母亲:母亲
}
}
var Mother=function(){
var children=makeChildren();
返回{
儿童:儿童
}
函数makeChildren(){
var children=[];
对于(变量i=0;i<10;i++){
var c=new Child(this);//当您从母对象内调用makeChildren()时,可以尝试传递对母对象的引用,例如:
var Mother = function() {
var children = makeChildren(this);
}
然后,makeChildren()函数可以接受引用作为参数,您可以使用该引用:
function makeChildren(ref)
var c = new Child(ref);
不知道这是否有效,但可能值得一试。嵌套函数不会从其父函数继承this
,因此makeChildren()
中的this
与母构造函数中的this
不同,除非在调用makeChildren()时显式设置它
:
这应该可以在不进一步修改代码的情况下工作
或者,您可以保存对该
的引用,并将其传递到函数中:
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;
}
}
var-Mother=function(){
var self=this;//Javascript的this
不是词法。这意味着makeChildren
获得自己的this
,而不是您想要的母亲的this
将一个普通变量设置为该值,然后改用它
var that = this;
function makeChildren(){
blabla = that;
}
但我认为这样做还不够。通过从构造函数返回一个对象,可以忽略this
。在其中设置一些内容:
this.children = children;
而不是返回一个新对象
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
}
};
Mother
对象中的前三行确保that
的值是Mother
实例,而不是全局对象。如果没有它们,您将始终必须编写:
var m = new Mother();
自变量只能从母函数内部访问,不是吗?除非你明确地传递了一个引用?@jayp:内部函数可以使用其范围内的所有变量,这包括外部函数的变量。出于某种原因,我认为makeChildren不是一个内部函数,而是一个单独的函数-显然我没有正确阅读。谢谢。如果makeChildren
是单独的(非内部的)函数.call
语法将允许它工作。或者您可以将引用作为参数传递。使用magic这个变量玩游戏通常会让人失去脚。我喜欢这个解决方案,因为它简单、直接,而且makeChildren
不需要在特殊的情况下调用设置this.children=makeChildren()
有效。一般来说,这被认为是一种比从构造函数返回对象更好的模式吗?只是在使用new
语法进行构造函数时,您可以使用this
如果您计划拥有一个返回自己的东西的函数,而不需要访问它来继承或访问原型方法,那么您最好将它设置为一个普通的非构造函数函数。(并使名称不大写。对于需要新的
操作符的事物,约定保留该名称)
var m = Mother();
var m = new Mother();