从内部自执行匿名成员函数访问父原型范围

时间:2015-11-02 20:34:23

标签: javascript scope anonymous-function

我定义了一个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());




有没有更好的方法来实现这一目标?

2 个答案:

答案 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)

使用callapply

Parent.prototype.doSomething = function() {
    return this.childObject.doSomething.call(this);
};

或者您可以使用bind

Parent.prototype.childObject = function() {
    return {
        doSomething: (function() {
            // undefined, but should be 'hello world'
            return this.memberVariable;
        }).bind(this)
    }
}();