我在模块(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'
拉起,这是可以理解的。
答案 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
,但现在可以轻松引用该实例。
这种方式将使用更多周期,另一种方法是直接为每个实例提供它自己的类别属性(可以有不同的继承链)但那将使用更多内存