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

Different ways of obtaining string representation of object

本文关键字:方法 字符串 取对象 获取 表示      更新时间:2023-09-26

我有一个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方法。

以前的方法有什么问题?

您正在处理范围问题。首先,您的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;
};

你犯了两个错误:

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

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

编辑:更具体地说:我个人认为这可能会让开发人员感到困惑,因为他们可能认为他们使用的是原生 JavaScript方法,但如果你不这样认为,也没有问题。

您使用var stringRep和var typeep创建了2个局部变量,但随后试图使用这个将它们作为Data类的字段记录下来。stringRep和这个。

将两个var关键字替换为"this."或删除日志命令中的两个"this."。

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