在JavaScript中,当我在对象内部创建函数和变量时,我怎样才能避免每次都使用“this”?

时间:2016-09-26 18:38:03

标签: javascript

我正在使用包含函数和成员的简单JavaScript对象 问题是,每次我使用其中一个成员或函数时,我都要添加this 编写this会增加更多工作,那么如何在每个成员变量或成员函数之前避免使用它?
例如:

var MyClass = cc.LayerColor.extend({
    sprite:null,
    stopGameLoop:false,
    labelScore:null,
    winSize:0,
    visibleOrigin:0,
    blocksList : [] ,
    circle:null,
    gameOverScreen:null,
    circleblockY:0,
    circleblockX:0, 
    blocksNum:0,
    currentState:0,
    zCount:0,
    currentZorder:0,
    iScore:0,


    ctor:function () {
        //////////////////////////////
        // 1. super init first
        this._super();
        this.init( cc.color(255,255,255, 255) ); 
        this.winSize = cc.winSize;
        this.visibleOrigin = cc.director.getVisibleOrigin(); 

        this.setGameOverScreen(this.blocksNum);                 
        this.setLevel(this.circleblockY,this,circleblockX);
        return true;
    },
    setLevel:function (a,b,c) {
    },
    setGameOverScreen:function (foo) {
    },


});

始终使用,this为什么?

2 个答案:

答案 0 :(得分:2)

您指的是对象属性,因此您必须告诉JavaScript引擎您要从哪个对象读取它们; Java或C#中没有隐式this。您使用的引用是this,因此您必须在代码中使用this.

可能使用with构造将对象的所有属性转储到作用域中,但这样做强烈劝阻 - 如此强烈,事实上,当TC-39(操纵JavaScript的委员会)在2009年发布ES5时,他们添加了一个新的“严格模式”来做各种事情,其中​​一个就是完全禁止with严格模式

使用显式对象引用就是在JavaScript中完成它的方式。

JavaScript中还有其他一些编程风格不使用this,其中一些可以在很大程度上避免通过操纵闭包使用对象引用,但是查看代码时它们与框架不兼容你正在使用/库。其他人避免使用this,但仍然有明确的对象引用(例如foo.),因此这不会有任何帮助。

当然,如果您只想缩短它,可以将其别名为变量:

var t = this;
t._super();
t.init(/*...*/);

(假设您正在使用的lib不使用函数反编译来明确地查看this,有些人曾经这样做,但希望现在没有任何现代的东西......)

...但坦率地说,我建议您对this感到满意。

答案 1 :(得分:0)

这是一个构造函数,意味着您正在使用此函数来创建对象。对象是this。您需要指定您正在对this执行所有这些操作。这是一个故意的事情,而不是一个错误,没有任何理由可以改变它。如果您需要在其他函数或setTimeout中使用它,您可以声明一个新变量,并通过执行以下操作使其引用thisvar that = this;