我对一个js问题的分析
<script>
function foo(){
foo.abc = function(){alert('def')}
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}
}
foo.prototype.abc = function(){alert('456');}
foo.abc = function(){alert('123');}
var f = new foo();
f.abc();
foo.abc();
abc();
</script>
问题来自: 中国狐([url]www.foxjs.cn[/url]) 详细出处参考:[url]http://www.foxjs.cn/article.asp?id=607[/url]
我的分析结果----->
不运行看看什么结果,分析下
1.采用逐步扩展变量的方法分析:
看这个:
<script>
abc = function(){alert('@@@@@')};-----其实这里等价于window.abc=function(){alert('@@@@@')};一个赋值语句
abc();-----其实这里等价于window.abc();
</script>
结果肯定是@@@@@了。
2.放到函数里面赋值
<script>
function foo()
{
abc = function(){alert('@@@@@')};
}
abc();
</script>
在执行foo();之前是什么也不会输出的,因为还没有对abc赋值,也就是函数引用为null
如果这样,
<script>
function foo()
{
abc = function(){alert('@@@@@')};
}
foo();//函数执行了赋值语句
abc();
</script>
就会输出@@@@@了。
3.看看构造函数
function foo()
{
this.abc = function(){alert('xyz')}------有了this就成为了构造函数
abc = function(){alert('@@@@@')};--window.abc
}
foo();//产生一个匿名对象?然后销毁?
abc();
</script>
上面只是当作了普通的函数执行了赋值语句。
结果:@@@@@
再看如下:
<script>
function foo()
{
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
}
var f=new foo();
f.abc();---this指向了f
abc();---window.abc()
</script>
结果:xyz @@@@@
再看
<script>
function foo()
{
foo.abc=function(){alert('def');};---对比下window.abc=function{alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
}
var f=new foo();
f.abc();
foo.abc();---这里类似window.abc();
abc();
</script>
结果:xyz def @@@@@
4.
<script>
function foo()
{
foo.abc=function(){alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}--添加了个局部作用域的abc在foo()函数内部会覆盖
---例如在这里调用abc()会执行局部的函数
}
var f=new foo();
f.abc();
foo.abc();
abc();
</script>
结果和上面的相同。
看下面的:
<script>
foo.abc = function(){alert('123');}---在调用new foo()之前赋值会在后面被重写
function foo()
{
foo.abc=function(){alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}
}
var f=new foo();
f.abc();
foo.abc();
abc();
</script>
结果还是一样。
function foo()
{
foo.abc=function(){alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}
}
var f=new foo();
foo.abc = function(){alert('123');}---但是在new foo()调用之后,而foo.adb()调用之前重写函数,结果受影响
f.abc();
foo.abc();
abc();
</script>
结果:xyz 123 @@@@@
5.原型对象prototype
<script>
function foo()
{
}
foo.prototype.abc = function(){alert('456');}
var f=new foo();
f.abc();
</script>
结果:456
虽然foo()内部没有明确的定义方法abc()但是我们发现好像foo类定义了一个abc()方法似的。---等于我们为foo类的父类添加了一个可继承的方法
下面重写方法覆盖父类中的方法
<script>
function foo()
{
this.abc = function(){alert('xyz')}
}
foo.prototype.abc = function(){alert('456');}
var f=new foo();
f.abc();
</script>
结果:xyz
转载于:https://blog.51cto.com/xcf007/101048
我对一个js问题的分析相关推荐
- JS加密算法简单分析
这次分析百度音乐的评论请求的加密,首先先看包 看到有两个地方1. param,2. sign,基本可以断定sign是用的MD5加密的 那么我们从html页面分析入手,恰巧看到html代码中有写到这么一 ...
- 构建meteor应用程序_我如何在一个月内构建一个复杂的文本分析应用程序
构建meteor应用程序 by Jeffrey Flynt 由Jeffrey Flynt 我如何在一个月内构建一个复杂的文本分析应用程序 (How I built a complex text ana ...
- 基于SSH2做一个24小时订单分析表格
基于SSH2做一个24小时订单分析表格 以下为要实现的最终效果截图: ps:没有时间优化前段页面样式,对前段美化有要求的小伙伴可以自行引用BOOtStrap.esayUi 或者 layUi 自行优化. ...
- 移动端开发基本知识之touch.js,FastClick.js源码分析
问题1:300ms延迟问题指的是? 不管在移动端还是PC端,我们都需要处理用户点击,这个最常用的事件.但在touch端click事件响应速度会比较慢,在较老的手机设备上会更为明显(300ms的延迟). ...
- 淘淘商城第103讲——js跨域分析
通过前几讲的学习,我有理由相信大家都写完了用户登录这个接口,登录的时候我们把token写入到了Cookie当中,登录成功后,我们查看Cookie的信息,如下图所示,发现是有token信息的. 我们回到 ...
- video.js 源码分析(JavaScript)
video.js 源码分析(JavaScript) 组织结构 继承关系 运行机制 插件的运行机制 插件的定义 插件的运行 控制条是如何运行的 UI与JavaScript对象的衔接 类的挂载方式 存储 ...
- impress.js 源码分析
impress.js 源码分析 之前做展示用幻灯片,我一直热衷于使用PPT,刚开始学习PPT时总是强行使用各种页面特效,越做越复杂.现在看来,学技术大概都要经历一个从简到繁再到简的过程吧.后来,无 ...
- 从恶意软件获得的新姿势——通过rundll32.exe执行js原理详细分析
今年7月份,国外研究机构发现了一个比较新型的恶意软件,这个恶意软件不会在系统上安装任何文件,而是藏身在windows的注册表中通过rundll32.exe执行JavaScript代码. 听上去确实很有 ...
- html如何打包压缩,所有css打包压缩到一个js里面
所有css打包压缩到一个js里面 打包css文件的意义:最终把css文件压缩到最终生成的js文件里,页面不需要再加载css文件,并且是压缩过的 打包css文件,安装style-loader css-l ...
最新文章
- 高并发之存储篇:关注下索引原理和优化吧!躲得过实践,躲不过面试官!
- stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验
- Silverlight运行原理经典问答。
- 【图像分割】图像分割专栏栏主自述:分割,我们究竟在研究什么?
- 3.Factory Method 工厂方法模式(创建型模式)
- for循环执行次数_VB考试笔记之循环控制结构部分
- (软件工程复习核心重点)第四章总体设计-第一节:总体设计基本概念和设计过程
- 万能搜索监控ip工具_录像机搜不到摄像头IP可能是以下原因
- Linux按照行数、大小切分文件
- https报文 完整_报文 HTTP HTTPS
- 图像特征原理--HOG特征
- 求解会议安排问题A - RJ501求解会议安排问题
- android+nfc+公交卡,Android NFC 读取公交卡信息Demo
- MS SQL基本语法及实例操作
- linux篇【12】:网络套接字<前序>—网络基础+udp套接字
- 【视频】海康威视摄像头RTSP协议格式
- 科创板发行上市审核25个监管案例汇编
- 《C语言小程序篇---1》——实现一个“富婆通讯录“(超详细)
- 把Safari整个页面翻译成中文,,
- 洛谷刷题笔记 整理药名
热门文章
- C# HttpClient设置cookies的两种办法
- Java虚拟机10:类加载器
- HDU 1867 KMP
- 格密码教程(三):基础域概念,体积等;阿达马不等式,行列式
- 鸿蒙霸榜 GitHub,从最初的 Plan B 到“取代 Android”?
- 复旦博士用130行代码搞定核酸统计,2分钟解决人工一小时工作量
- 从头到尾再讲一遍ThreadLocal
- “因为你不懂技术…” 警察:???
- 聊聊自己的高效学习方法~
- MiniDao_1.6.4 版本发布,轻量级Java持久化框架,Hibernate项目辅助利器