1

我已经声明了这个 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());

但后来我收到类似“没有push未定义的方法”的错误

奇怪的是我有这个类声明:

         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”。部分,但它只是拒绝工作!如果今晚这不起作用,我会杀了一个人,有人可以帮帮我吗?

4

2 回答 2

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在构造函数内部使用。只需将属性设为普通变量即可。

于 2013-01-27T16:39:19.373 回答
0

好的,伙计们,我发现了我的问题:
对当前实例的所有变量的引用都不应该以this.关键字开头,所以这就是我的声明现在的样子:

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

感谢@Bergi 指出这一点

于 2013-01-27T17:07:37.150 回答