我一直在使用Prototype Revealing Pattern,这是一个简单的例子,如下所示。
如果我返回未注释的对象以从原型函数中公开公共函数,它可以正常工作jsFiddle
另一方面,如果我使用另一个嵌套对象(被注释掉的那个)来组织不同层次结构中返回的公共函数,仍然可以调用函数但是在'this'中未定义instanceVar
我理解为什么(我认为),但我不知道如何传递正确的'this'实例,或者如果它甚至可能使用这种模式,我想知道是否有人知道如何实现这一目标?
我曾尝试过.call(this)以多种方式,仍然无法获得任何乐趣。
WhoSays = function (sentence) {
this.instanceVar = sentence;
};
WhoSays.prototype = (function () {
var jimSays = function () {
return 'jim says ' + this.instanceVar;
};
var bobSays = function () {
return 'bob says ' + this.instanceVar;
};
/*return {
says : {
jim : jimSays,
bob : bobSays
}
};*/
return {
jim: jimSays,
bob: bobSays
};
}());
。 更新:
我不想修改调用,调用者不应该知道如何使用超出明显的模式。
我确信这可能不是一种聪明的做事方式,命名空间层次结构可能是一种更好的方法,但我仍然感兴趣,如果没有使用调用从调用者的角度绑定'this'这是可能的例如who.says.jim.apply(谁)
答案 0 :(得分:1)
如果你真的希望它像你正在尝试一样工作,那就像这样使用它:
WhoSays = function (sentence) {
this.instanceVar = sentence;
};
WhoSays.prototype = function () {
var jimSays = function () {
return 'jim says ' + this.instanceVar;
};
var bobSays = function () {
return 'bob says ' + this.instanceVar;
};
return {
says : {
jim : jimSays,
bob : bobSays
}
};
/*
return {
jim: jimSays,
bob: bobSays
};*/
}();
var who = new WhoSays("works!");
console.log(who.says.jim.apply(who)); // logs "jim says works!"
答案 1 :(得分:0)
当您致电new WhoSays().says.jim()
时,this
为new WhoSays().says
,而不是您想要的new WhoSays()
。
你可以尝试:
WhoSays.prototype = (function () {
return {
says: function() {
var self = this;
return {
jim : function() {
return 'jim says ' + self.instanceVar;
},
bob : function() {
return 'jim says ' + self.instanceVar;
},
}
};
};
}());
然后拨打new WhoSays().says().jim()
。
或使用Object.defineProperty
为符号偏好定义getter says
。
我个人的偏好是使用更传统的方式来获得你想要的东西。
答案 2 :(得分:0)
您可以尝试以下代码:
var WhoSays = function (sentence) {
this.instanceVar = sentence;
this.says=new Says(this);
};
var Says = function(whoRef) {
this.whoRef=whoRef;
};
Says.prototype.jim = function () {
return 'jim says ' + this.whoRef.instanceVar;
};
Says.prototype.bob = function () {
return 'bob says ' + this.whoRef.instanceVar;
};
var b = new WhoSays("b");
console.log(b.says.jim());
var c = new WhoSays("c");
console.log(c.says.jim());
console.log(b.says.jim());
有关原型,继承,覆盖https://stackoverflow.com/a/16063711/1641941
的更多信息了解this
可以是什么:https://stackoverflow.com/a/19068438/1641941