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

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

var arr=[];
Array.prototype={
push:function(){
alert("");
}
};
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”,有截图为证

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

最新文章

  1. 关于《Linux.NET学习手记(8)》的补充说明
  2. 【POJ】1811 Prime Test
  3. mysql慢日志设置
  4. 20145236 《Java程序设计》第7周学习总结
  5. iOS H5容器的一些探究(一):UIWebView和WKWebView的比较和选择
  6. 60款开源云应用【Part 2】(60 Open Source Apps You Can Use in the Cloud)
  7. NPOI使用手册
  8. phpcms V9 联动菜单的调用
  9. 转:Raspberry Pi(树莓派)试用小记
  10. 行内元素有哪些?块级元素有哪些?CSS的盒模型?转载
  11. Fedora最小化安装后没有ifconfig命令
  12. python中打印文件名,行号,路径
  13. Python 修炼3
  14. android网络编程之HttpUrlConnection的讲解--GET请求
  15. 百度地图JavascriptApi Marker平滑移动及车头指向行径方向
  16. 命令行中的 vi 模式
  17. Nginx GoAccess安装与配置
  18. HTTP 07 追加协议与 Ajax
  19. JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)
  20. [troubleshoot][archliunx][chromium][flash] chrome提示flash不是最新

热门文章

  1. C#通用模块专题
  2. c#6.0特性
  3. C#读写EXCEL(二)
  4. [原创]Spring Boot + Mybatis 简易使用指南(二)多参数方法支持 与 Joda DateTime类型支持
  5. ffmpeg码率控制
  6. ARCGIS中怎么去除重复的面?(转)
  7. powerdesigner设计的pdm模型导出清晰图片格式
  8. mongo状态查看方法
  9. opennebula 对接创建模板参数
  10. .Net插入大批量数据