为什么标记的行找不到protectedACMember
var Module = (function (ns) {
function AbstractClass() {
this.protectedACMember = "abstract";
this.abstractPublicACMethod = function (input) {
this.methodToImplement();
}
}
ConcreteClass.prototype = new AbstractClass();
function ConcreteClass(){
var privateCCMember = "private CC";
var privateCCMethod = function(){
alert(this.protectedACMember); // cant find protectedACMember
}
this.methodToImplement = function(){
privateCCMethod();
console.log('Implemented method ');
}
}
ns.ConcreteClass = ConcreteClass;
return ns;
})(Module || {});
//somewhere later
var cc = new Module.ConcreteClass();
cc.abstractPublicACMethod();有没有好的模式来模拟私有的、受保护的和公共的成员?静态/非静态也可以吗?
发布于 2013-01-29 21:53:51
您应该像这样更改代码的这一部分:
var self = this;
var privateCCMethod = function(){
alert(self.protectedACMember); // this -> self
}这样,您就可以在闭包中获得引用。
原因是,"this“是保留字,它的值是由解释器设置的。您的privateCCMethod是一个匿名函数,而不是object属性,所以如果您只是通过privateCCMethod()语法来调用它,那么它将为null。如果你想把"this“绑定到特定的东西上,你总是可以使用.call语法,如下所示:
privateCCMethod.call(this)发布于 2013-01-29 21:49:48
它找不到protectedACMember,因为当您输入函数privateCCMethod时,this关键字的含义发生了变化。一种常见的做法是存储外部this,以便在函数内部使用:
function ConcreteClass(){
var privateCCMember = "private CC";
// store the outer this
var that = this;
var privateCCMethod = function(){
alert(that.protectedACMember);
}
...你剩下的问题是相当多的,可能应该作为一个单独的问题发布。
发布于 2013-01-29 21:59:39
另一种确保this就是你想要的东西的方法是使用bind。Bind允许您确保使用特定值this调用函数。
大多数较新的浏览器都支持它(甚至IE9!)对于那些不这样做的人,有一个解决方案。
https://stackoverflow.com/questions/14584449
复制相似问题