toString()一个会自动调用的方法

时间:2016.04.19 发布人:某年某个地点

toString()一个会自动调用的方法

已解决问题

谷歌某年某个地点用户在2016.04.19提交了关于“极限挑战toString()一个会自动调用的方法”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-01T08:25:03。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,你是我的宝贝,你是我的花,谢谢你对我的帮助!

希望以下的回答,能够帮助你。

第1个回答

用户名:j**ichuang  

这一特性显然有助于你偷懒,当然也有利于实现一些特定的功能。为了说明这一特性,下面从一个实际回计烧诉审万读赶州步开发案例说起。

如果在你的WEB项目中,有很多班保针地方都需要输出像下面这样的一个列表h**TML:
复制代码代码如下:
<ul>
<li>J**aScript事件冒泡应用实例</li>
<li>执行AJAX返回h**来自TML片段中的J**aSc问答ript脚本</li>
</乎首历本补通商越黑现司ul>

很显然这是一个LI结构,也许你会想每次要输出这样结构气笔增重的h**TML,难道自己都要去拼这些LI标签吗?我能不能每次调用一个方法谁任动还路调半配晚仅输入LI中间的文本内容,最终简单地得到一个完整的ULh**TML结构呢。当然可以,程序的实现有N种方法,看看下面这种方法,这种方法显然简单而且科学:
复制代码代码如下:
functionulBuilder()
{
varlis='';
this.addLi=function(liText)
{
lis+='<li>'+liText+'</li>';
};

th值is.toString=function()
{
return'<ul>'+lis+'</ul>';
};
}

varulh**tml=newulBuilder();
ulh**tml.addLi('J**aScript事件冒泡应用实例');
ulh**tml.addLi('执行AJAX返回h**TML片段中的J**aScript脚本');
alert气妈愿频味玉钢镇封季(ulh**tml);

在上朝几李呀以兵读面的代码中,我们定义了一个类叫ulBuilder,它有两个公开方法addLi、toString,addLi方法是添加一个包含内容的LI标签,而toString方法是生成最终需要的ULh**TML。在这个类的实际使用过程中,你根本没有看到toString方法的调用,但非技是alert(ulh**tml)却显示了完整的UL结构的h**TML。

实际上alert()的时候,脚本解析器会自动检查alert变量或对象的toString方法并调用它。在上面的例子中,是我们重写了toString方法,而恰好这个方法会由程序自动调用执行。

话题扩展:
1、在一些务员切周面向对象的开发语言中,比如C#、J**A都有构造函数,这个构造函数显然作为类的一个成员方法,要想执行里面的代码,并不需要我们手动去调用这个方法,这个方法**定义的代损顶序滑侵质事跳码会在类实例化的时候自动执行信货卷含江宣要含叶。当然,为了让系统能自动执尼物象坟味夜建总行一些特定的方法,往往程序架构会对这些方法的命名规则有规定,比如构造贵五农假声方法的名称要与类名相同。像上充我缺迫传面的例子中,如果把this.toString改成this.toUL,那么要想得到正确的结果只能像这样调用了alert(效若跳故着他灯征滑剂ulh**tml.toUL())。

2、由于toString方法可以被重写,有时候显的特别有用。看看下面的例子,试一下没有重写与重写后输出的结果有什么不同。这个例子显然很不健壮,增论命究林往觉比如对数组嵌套的情况没有作带每很图令凯厚容度处理,而且实际意义也不大,只为让你知道可以这样做。
复制代码代码如下:
Array.prototype.toString=function()
{
return'[\''+this.join('\',\'')+'\']';
};
varcompanys=['Adobe','Apple','Google','Intel','Microsoft','Oracle','IBM','SUN'];
alert(companys);

下面再举一个例子,这个例子比上面例子实用些。正常情况下你alert(JSON)的时候,并不能看到JSON的真正结构,只出[objectObject],试试下面的实现,也许这是你想要的结果。当然这个方法也是很不完善的,真要使用这样的功能,请到JSON官方站点去下载相关JS库吧:
复制代码代码如下:
varuserInfo=
{
"name":"Mike",
"age":23,
"phone":"020-87654321",
"toString":function()
{
varobjStr='';
for(varkeyinthis)
{
if(typeof(this[key])=='string')
objStr+='"'+key+'":"'+this[key]+'",';
}
return'{'+objStr.replace(/,$/,'')+'}';
}
}
alert(userInfo);

作蘸WebFlash