javascript - js的扩展原型的问题
高洛峰
高洛峰 2017-04-10 16:17:49
[JavaScript讨论组]


这么写报错,内存溢出,我在哪里写了死循环啊?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
怪我咯

~如果Function原型中没有或String的原型中没有trim方法~
~那么你这个不是在不停调用trim方法,而trim方法在反复往prototype中添加trim方法,实际的工作一点没~有,永远没有机会执行else~~~
~因为 'trim' in this 语法会在其原始链中寻找trim属性,不光在当前对象上~
~那就结果是一直都是true~

Function.prototype.method=function(name,func){
    this.prototype[name]=func;
    return this;
}
String.method('trim',function(){
    if('trim' in this){
        return this.trim);
    }else{
        return this.replace(/^\s+|\s+$/g,'');
    }
    
});

上面的代码为Function原型提供了一个method方法,通过它可以为原型添加新的方法

为String原型添加一个trim方法
原意为当调用对象或上下文存在trim属性的话,就调用原来的trim方法,否则就调用replace方法

可是你要知道在你调用了String.method后,在String的原型链中就添加了一个trim方法,即使原String原型链中有trim方法,也被你覆盖啦~~~
等价为

String.prototype.trim=function A(){
    if('trim' in this){//a
        return this.trim();//b
    }else{
        return this.replace(/^\s+|\s+$/g,'');
    }
}

再看下实际运行过程中出现了什么问题
a处被执行 in操作符会在当前对象及其原型链中去寻找是否有相应的属性;结果为true,这个属性对应的就是刚刚定义的函数A,
b处被调用 函数A被作为方法被调用,this指向同一个对象,回到a处

这样就一直在不停的递归调用,而没有退出的机会

修改方法2种

方法:1
覆盖原型链的同名属性对应的方法,不管其是否存在;有破坏性

Function.prototype.method=function(name,func){
    this.prototype[name]=func;
    return this;
}
String.method('trim',function(){
    return this.replace(/^\s+|\s+$/g,'');
});

方法2:
保持原型链中原属性对象的方法;如果不存在这个属性,那么将传入的赋值给它;相对温柔

Function.prototype.method=function(name,func){
    if(!this.prototype[name]){
        this.prototype[name]=func;
    }
    return this;
};
String.method('trim',function(){
    return this.replace(/^\s+|\s+$/g,'');
});
Function.prototype.method=function(name,func){
    this.prototype[name]=func;
    return this;
}
String.method('trim',function(){
    if('trim' in this){
        return this.trim();
    }else{
        return this.replace(/^\s+|\s+$/g,'');
    }
    
});
迷茫
if (this.hasOwnProperty('trim')) {
    return this.trim();
  } else {
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号