当调用'this'的函数在子对象的对象中时,你会如何引用'this'?

时间:2014-12-19 03:16:07

标签: javascript node.js function object this

我在模块(Node)中有以下设置,但这可以适用于任何地方。

function Storefront(){
    this.list = 'List';
    }

Storefront.prototype = {
    categories : {
             get : function(){
                   return this.list + ' here!';
                   }
             }
    }

module.exports = function(){
    if(!(this instanceof Storefront)) { return new Storefront(); }
    }

稍后,我将另一个模块中的对象实例化为sfront并调用sfront.categories.get();

通常,在函数内部执行var self = this;,在其中调用子函数然后引用self会很容易。这显然不起作用:引用'this'的对象在另一个对象中。我不太确定如何将父对象Storefront的上下文传递给子对象的(categories)子属性函数'get'。现在它正以'undefined'拉起,这是可以理解的。

2 个答案:

答案 0 :(得分:2)

您可以将categories作为属性:

Object.defineProperty(Storefront.prototype, 'categories', {
    get: function () {
        var storefront = this;

        return {
            get: function () {
                return storefront.list + ' here!';
            }
        };
    }
});

...这是重命名嵌套get的好参数。但是,根据categories应该代表的内容,将它完全变为不同的类可能更合适:

function StorefrontCategoryList(storefront) {
    this.storefront = storefront;
}

StorefrontCategoryList.prototype.get = function () {
    return this.storefront.list + ' here!';
};

function Storefront() {
    this.list = 'List';
    this.categories = new StorefrontCategoryList(this);
}

答案 1 :(得分:1)

Object literal 中定义get ter。

function Storefront(){
    this.list = 'List';
} 
Storefront.prototype = {
    get categories () {
        var self = this;
        return {
            "get": function () {
                return self.list + ' here!';
            }
        };
    }
};
(new Storefront()).categories.get(); // "List here!"

虽然您无法设置为foo.categories,但现在可以轻松引用该实例。

这种方式将使用更多周期,另一种方法是直接为每个实例提供它自己的类别属性(可以有不同的继承链)但那将使用更多内存