获取对象的字符串表示的不同方式

时间:2014-08-08 14:25:00

标签: javascript

我有一个javascript类Data,其中我试图获取对象的字符串表示形式:

function Data(t, s, m) {    
    this.time = t;
    this.sender = s;
    this.message = m;    
    var stringRep = function() {
        return ("time:" + this.time + " sender:" + this.sender + " message:" + this.message)

    };
    console.log(this.stringRep); //returns undefined    
    var typeRep = (jQuery.type(1234));
    console.log(this.typeRep); //returns undefined

    Data.prototype.toString = function DataToString() {
        var ret = "time:" + this.time + " sender:" + this.sender + " message:"
                + this.message;
        return ret;
    }
    console.log(this.toString()); //returns correct toString representation
}

首先,我尝试使用stringRepundefined。然后我甚至试图得到简单的类型。 1234使用typeRep并返回undefined。最后,我从MDN获得了帮助,正确覆盖了toString方法。

之前的方法出了什么问题?

4 个答案:

答案 0 :(得分:2)

您正在处理范围问题。首先,您的stringRep函数未定义为Data的属性,仅作为变量。你想要做的是:

function Data(t, s, m) {
    this.stringRep = function() {
        // Your definition goes here
    };

    // Now you can call it like so
    console.log(this.stringRep());
};

至于你的toString,你正确地覆盖了它,但如果你在构造函数中这样做,那么每次生成一个新的Data实例时都会重新创建它。相反,试试这个:

function Data(t, s, m) {
    // All of your code except for toString
};

Data.prototype.toString = function() {
    var ret = "time:" + this.time + " sender:" + this.sender + " message:"
            + this.message;
    return ret;
};

答案 1 :(得分:0)

您使用var stringRep和var typeRep创建了2个局部变量,但后来尝试使用this.stringRep和this.typeRep将它们作为Data类的字段记录,或者替换两个" var&#34 ;关键字" this。"或删除这两个"这个。"在日志命令中。

答案 2 :(得分:0)

你犯了两个错误:

  • 您将stringRep定义为私有变量,并尝试调用它 做this.stringRep。您需要将其定义为属性 执行this.stringRep = function(){ //...}
  • 的数据实例
  • stringRep是一个函数,您需要执行this.stringRep() 执行它。

顺便说一句,你应该避免覆盖toString()方法。

编辑:更具体一点:就个人而言,我认为开发人员可能会感到困惑,因为他们可能认为他们使用的是本地 JavaScript方法,但如果您不这么认为,那就是没问题。

答案 3 :(得分:0)

基本上,stringReptypeRef都被定义为私有变量,但您尝试将它们用作字段。因此,理想情况下,您应该使用this.前缀定义两个变量,或者只是避免使用this.前缀调用这两个变量。