我试图重写Object.prototype.toString以添加其他类描述的功能。
这是初始代码:
(function(toString){
Object.prototype.toString = function(){
if(this instanceof TestClass)
{
return '[object TestClass]';
}
return toString.apply(this, arguments);
}
})(Object.prototype.toString);
function TestClass(){}
var instance_obj = new TestClass();
Object.prototype.toString.call(instance_obj);
当我在控制台中运行它时,我得到以下输出:
[object TestClass]
好处是它不会彻底改变Object.prototype.toString工作方式,因此使用另一种类型[即不是 TestClass],事情会按预期工作,例如Object.prototype.toString.call(12)将输出[object Number].
到目前为止,这个实现没有任何问题。但是,我有另一个实现,代码如下:
(function(toString){
var fn_code_str = `return function(){
if(this instanceof TestClass)
{
return '[object TestClass]';
}
return toString.apply(this, arguments);
}`;
var pre_fn = new Function(fn_code_str);
Object.prototype.toString = pre_fn();
})(Object.prototype.toString);
function TestClass(){}
var instance_obj = new TestClass();
Object.prototype.toString.call(instance_obj);
这似乎是 的递归问题toString.apply。但是,我不明白为什么第二个实现是递归的,如果第一个实现不是递归的?
注意if(this instanceof MyClassType){return '[object MyClassType]'}:第二个实现的原因是从数组中的类名列表动态添加不同类的类型检查代码[即]。换句话说,我不是修改每个新类的代码,而是将类名附加到数组中,然后自动生成条件语句。
翻过高山走不出你
相关分类