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

Javascript 获取对象字符串表示的不同方法,javascript,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.

我有一个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
}
首先,我尝试使用
stringRep
,它给出了
undefined
。然后我甚至尝试使用
typeRep
获取简单编号1234的类型,该类型也返回
undefined
。最后,我得到了来自的帮助,以正确重写
toString
方法


以前的方法有什么问题?

您使用var-stringRep和var-typeRep创建了两个局部变量,但尝试使用this.stringRep和this.typeRep将它们记录为数据类的字段,或者用“this.”替换两个“var”关键字,或者删除log命令中的两个“this.”

您犯了两个错误:

  • 您将
    stringRep
    定义为私有变量,并尝试调用它 通过执行
    this.stringRep
    。您需要将其定义为的属性 通过执行
    this.stringRep=function(){/…}
  • stringRep
    是一个函数,您需要执行
    this.stringRep()
    执行它
顺便说一下,您应该避免覆盖
toString()
方法


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

你正在处理范围界定问题。首先,您的
stringRep
函数不是定义为
数据的属性,只是定义为一个变量。您要做的是:

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

    // Now you can call it like so
    console.log(this.stringRep());
};
对于
toString
,您正在正确地覆盖它,但如果您在构造函数中这样做,则每次生成新的
数据
实例时都会重新创建它。相反,请尝试以下方法:

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
typeRef
都被定义为私有变量,但您试图将它们用作字段。因此,理想情况下,您应该使用
this.
前缀定义这两个变量,或者干脆不使用
this.
前缀调用这两个变量。

this.stringRep
是未定义的,因为您刚刚声明了
var stringRep
;这同样适用于
this.typeRep
;为什么局部变量
stringRep
typeRep
会是
this
或任何对象的成员?“避免覆盖toString()方法”为什么?这样做没有错。因为您可能需要执行本机
toString()
方法进行调试,而且这可能会让用户感到困惑,他们可能(我会)认为他们正在执行本机
toString()
方法。为什么会有人期望得到
[对象]
?如果是,那么他们可以检查它是否真的是一个对象,他们可以执行
object.prototype.toString.call(data)
其中
data
是被覆盖对象的实例。像下划线这样的框架就是这样做的。他们会期待它。。。因为这是本地方法会给他们的?相反,得到不同的东西会让他们困惑。你没有抓住重点,我知道一些框架是如何进行类型检测的。如果您想创建自己的框架并使用已经是原生JS方法的方法名,可以。我只是警告OP,它可能会混淆开发人员。@WaldoJeffers感谢您指出这两个错误。但是我也不同意你关于避免重写
toString()
方法的观点。