利用JScript的Literal Syntax特性用字符串表示对象
这里说的是JScript对象的字符串表示实现,利用的就是其Literal Syntax特性。
为了统一,我采用方法名为:toJSON,默认实现为无参数(如果你愿意,也可以写点参数的,),意思简单,话就不多说了,看代码:
这里的Apq只是一个普通对象(即new Object() || {}),自己添加下就行了。
Apq.toJSON()只是提供一个统一的调用接口,具体实现则由各自的类负责。
Object.prototype.toJSON()提供一个默认实现,一般不实用(想不出好办法,凑合一下)。
其余是常用类型我已实现的部分,仅供参考。
为了统一,我采用方法名为:toJSON,默认实现为无参数(如果你愿意,也可以写点参数的,),意思简单,话就不多说了,看代码:
/// toJSON --------------------------------------------------------------------------------------------------------------------------------
/// 用字符串表示对象
Apq.toJSON = function( o ) {
var strClassName = Apq.getClassName( o ).toLowerCase();
if( strClassName == "undefined" || strClassName == "null" )
{
return strClassName;
}
if( strClassName == "system.xml.xmldocument" || strClassName == "system.xml.xmlnode" )
{
// Xml 相关类
return o.xml;
}
var args = Function.Args2Ary( arguments, 1 );
return o.toJSON.apply( o, args );
};
/// Object
Object.prototype.toJSON = function(){
return "{}";
};
/// Array
Array.prototype.toJSON = function(){
var a = [];
for( var i = 0; i < this.length; i++ )
{
a.push( Apq.toJSON(this[i]) );
}
return "[ " + a.join( ", " ) + " ]";
};
Boolean.prototype.toJSON = function(){
return this.toString.apply( this, arguments );
};
Number.prototype.toJSON = function(){
if( isFinite( this ) )
{
return this.toString();
}
else if( isNaN( this ) )
{
return "NaN";
}
else
{
return "Number." + (this > 0 ? "POSITIVE_INFINITY" : "NEGATIVE_INFINITY");
}
};
String.prototype.toJSON = function(){
var s = this.replace( /(["\\])/g, '\\$1' );
s = s.replace( /\n/g, "\\n" );
s = s.replace( /\r/g, "\\r" );
return '"' + s + '"';
};
Error.prototype.toJSON = function(){
return "{ number: " + this.number + ", name: " + this.name + ", message: " + this.message + " }";
};
RegExp.prototype.toJSON = function(){
return this.toString.apply( this, arguments );
};
/// 用字符串表示对象
Apq.toJSON = function( o ) {
var strClassName = Apq.getClassName( o ).toLowerCase();
if( strClassName == "undefined" || strClassName == "null" )
{
return strClassName;
}
if( strClassName == "system.xml.xmldocument" || strClassName == "system.xml.xmlnode" )
{
// Xml 相关类
return o.xml;
}
var args = Function.Args2Ary( arguments, 1 );
return o.toJSON.apply( o, args );
};
/// Object
Object.prototype.toJSON = function(){
return "{}";
};
/// Array
Array.prototype.toJSON = function(){
var a = [];
for( var i = 0; i < this.length; i++ )
{
a.push( Apq.toJSON(this[i]) );
}
return "[ " + a.join( ", " ) + " ]";
};
Boolean.prototype.toJSON = function(){
return this.toString.apply( this, arguments );
};
Number.prototype.toJSON = function(){
if( isFinite( this ) )
{
return this.toString();
}
else if( isNaN( this ) )
{
return "NaN";
}
else
{
return "Number." + (this > 0 ? "POSITIVE_INFINITY" : "NEGATIVE_INFINITY");
}
};
String.prototype.toJSON = function(){
var s = this.replace( /(["\\])/g, '\\$1' );
s = s.replace( /\n/g, "\\n" );
s = s.replace( /\r/g, "\\r" );
return '"' + s + '"';
};
Error.prototype.toJSON = function(){
return "{ number: " + this.number + ", name: " + this.name + ", message: " + this.message + " }";
};
RegExp.prototype.toJSON = function(){
return this.toString.apply( this, arguments );
};
这里的Apq只是一个普通对象(即new Object() || {}),自己添加下就行了。
Apq.toJSON()只是提供一个统一的调用接口,具体实现则由各自的类负责。
Object.prototype.toJSON()提供一个默认实现,一般不实用(想不出好办法,凑合一下)。
其余是常用类型我已实现的部分,仅供参考。