Javascript 获取对象字符串表示的不同方法
我有一个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.
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()
方法的观点。