使用该类的实例时,我的javascript类中的变量是未定义的

时间:2013-01-27 16:35:04

标签: javascript object

我已经宣布了这个javascript类:

var TablixColumns = function(){
this.g = 'wtf';
this.tablixColumns = []; //[];
return {
    addTablixColumn: function(tablixColumn){
        alert(this.g);
         //this.tablixColumns.push(tablixColumn.getTablixColumn());
    }
}
};

我的问题是,当我尝试这个时:alert(this.g)警报未定义 当然我的初始函数定义是:this.tablixColumns.push(tablixColumn.getTablixColumn());

然后我得到的错误是“No Method push undefined”

奇怪的是我有这个班级声明:

         var TablixColumn = function(){
            columnWidth = '<Width>3.135cm</Width>'; //default width value

            return{
                setColumnWidth: function(width){
                    this.columnWidth = '<Width>' + width + 'cm</Width>';
                },
                getTablixColumn: function(){
                    return '<TablixColumn>' + this.columnWidth + '</TablixColumn>';
                }
            }
        };

并且TablixColumn类工作正常, 是的,我已声明this.g和this.tablixColumns没有'this'。部分,但它只是拒绝工作! 如果今晚不起作用,我会杀人吗能有人帮帮我吗?

2 个答案:

答案 0 :(得分:1)

您需要在嵌套函数表达式之外设置对当前对象(this)的引用。以下是代码的外观:

var TablixColumns = function() {
    ...
    var self = this;

    return {
        addTablixColumn: function(tablixColumn) {
            alert(self.g);
        }
    };
};

如果需要,您甚至可以将属性设置为返回的对象文字:

// ...
    return {
        g: 'wtf',
        addTablixColumn: function(tablixColumn) {
        alert(this.g); // 'wtf'
        }
    };
// ...

请注意,如果您从此处返回,则不应使用TablixColumns作为构造函数。你在这里使用两个成语;原型继承和模块模式。你打算用new实例化构造函数吗?如果是这样,那么不要返回对象文字。而是在函数的原型上设置方法:

var TablixColumns = function() {
    this.g = 'wtf';
    this.tablixColumns = [];
};

TablixColumns.prototype.addTablixColumn = function addTablixColumn() { ... };
TablixColumns.prototype./* ... */

...

否则,请勿在构造函数中使用this。只需将属性设为常规变量即可。

答案 1 :(得分:0)

好的,所以我想出了我的问题:
所有对当前实例变量的引用都不应该以{{1​​}}关键字开头 所以这就是我的宣言现在的样子:

this.

感谢@Bergi指出这个