1

为什么标记的行找不到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();

有模拟私人、受保护和公共成员的好模式吗?静态/非静态也是?

4

3 回答 3

1

您应该像这样更改那部分代码:

    var self = this;
    var privateCCMethod = function(){
        alert(self.protectedACMember); // this -> self
    }

这样您就可以在闭包中获得参考。

原因是“this”是一个保留字,它的值是由解释器设置的。您的 privateCCMethod 是一个匿名函数,而不是对象属性,因此如果您仅通过 privateCCMethod() 语法调用它,这将为 null。如果您希望“this”绑定到特定的东西,您可以始终使用 .call 语法,如下所示:

privateCCMethod.call(this)
于 2013-01-29T13:53:51.123 回答
0

它无法找到protectedACMember,因为this当您输入函数时,关键字的含义发生了变化privateCCMethod。一种常见的做法是将外部存储this在函数内部使用:

function ConcreteClass(){
    var privateCCMember = "private CC";

    // store the outer this
    var that = this;
    var privateCCMethod = function(){
        alert(that.protectedACMember);
    }
    ...

您其余的问题都已加载完毕,可能应该作为一个单独的问题发布。

于 2013-01-29T13:49:47.897 回答
0

确保这this意味着您想要的另一种方法是使用bind. Bind 允许您确保使用特定值调用函数this

大多数较新的浏览器都支持它(甚至是 IE9!),对于那些不支持的浏览器有一个解决方法。

绑定 - MDN 文档

于 2013-01-29T13:59:38.983 回答