zoukankan      html  css  js  c++  java
  • JS内置对象的原型不能重定义?只能动态添加属性或方法?

    昨天马上就快下班了,坐在我对面的同事突然问我一个问题,我说“爱过”,哈哈,开个玩笑。情况是这样的,他发现JS的内置对象的原型好像不能通过字面量对象的形式进行覆盖,

    只能动态的为内置对象的原型添加属性或方法,下面那个具体的例子说明:

    var arr=[];
    Array.prototype={
        push:function(){
            alert("1");
        }
    };
    arr.push();    //没有任何输出

    有人可能会说了“你先定义的arr,后来又修改了Array.prototype,这时Array.prototype.__proto__===Object.prototype,而arr.__proto__===[],所以arr找不到push方法”;那好这次我们把arr的定义放到Array.prototype的后面:

    Array.prototype={
        push:function(){
            alert("1");
        }
    };
    var arr=[];
    arr.push();    //输出0,因为arr是空数组,而且push没有传入任何参数,所以返回arr的length,即0

    看到了吧,arr调用的还是数组的原push方法,而不是Array.prototype的push方法,有人可能又要说了“内置对象是可以覆盖的,但是需要手动的为原型设置constructor,像这样constructor:Array”,好~,既然你们说了,那我们就再来看看:

    var arr=[];
    Array.prototype={
        constructor:Array,
        push:function(){
            alert("1");
        }
    };
    arr.push();    //毛也没输出啊

    死心了吧,嘿嘿,这是内置构造器,不是我们自定义的构造器,所以该方法是行不通的

    那么只有一个结论了,那就是“JS内置对象的原型不能整体覆盖,只能单独地动态地为原型添加属性或方法”,那么如何动态呢,就像这样:

    //无论arr放到那,Array.prototype.push的上面或下面都可以,push都能覆盖Array原型的原push方法
    var
    arr=[];
    //这就是动态 Array.prototype.push
    =function(){ alert("1"); } arr.push(); //此处提示“1”,有截图为证

    结语:希望大家不要被我搞糊涂,如有错误,还请各位多多指教,在此谢过

  • 相关阅读:
    队列的链式存储结构实现
    堆栈的链式存储实现
    使用C#改变windows系统本地时间
    oracle 多数值录入校验(分隔符“/”)
    oracle中in和exists的区别
    redis安装 windows版(图形化安装)
    Oracle 返回结果集
    饿了么4年 + 阿里2年:研发路上的一些总结与思考
    Oracle 获取各类时间
    Oracle表中已有数据,修改字段长度
  • 原文地址:https://www.cnblogs.com/webjoker/p/5344262.html
Copyright © 2011-2022 走看看