首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS模板方法模式中`this`的含义

JS模板方法模式中`this`的含义
EN

Stack Overflow用户
提问于 2013-01-29 21:46:14
回答 3查看 109关注 0票数 1

为什么标记的行找不到protectedACMember

代码语言:javascript
复制
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();

有没有好的模式来模拟私有的、受保护的和公共的成员?静态/非静态也可以吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-29 21:53:51

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

代码语言:javascript
复制
    var self = this;
    var privateCCMethod = function(){
        alert(self.protectedACMember); // this -> self
    }

这样,您就可以在闭包中获得引用。

原因是,"this“是保留字,它的值是由解释器设置的。您的privateCCMethod是一个匿名函数,而不是object属性,所以如果您只是通过privateCCMethod()语法来调用它,那么它将为null。如果你想把"this“绑定到特定的东西上,你总是可以使用.call语法,如下所示:

代码语言:javascript
复制
privateCCMethod.call(this)
票数 1
EN

Stack Overflow用户

发布于 2013-01-29 21:49:48

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

代码语言:javascript
复制
function ConcreteClass(){
    var privateCCMember = "private CC";

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

你剩下的问题是相当多的,可能应该作为一个单独的问题发布。

票数 0
EN

Stack Overflow用户

发布于 2013-01-29 21:59:39

另一种确保this就是你想要的东西的方法是使用bind。Bind允许您确保使用特定值this调用函数。

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

Bind - MDN Documentation

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14584449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档