第197天:js---caller、callee、constructor和prototype用法
一、caller---返回函数调用者
//返回函数调用者
//caller的应用场景 主要用于察看函数本身被哪个函数调用
function fn() {
//判断某函数是否被调用
if (fn.caller) {
alert(fn.caller.toString());
} else {
alert("函数直接执行");
}
}
function handleCaller() {
fn();
}
// fn被其他函数调用
handleCaller();
//fn没有被其它函数调用而是直接执行
fn();
二、callee---返回正被执行的 Function 对象
// 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文.
// callee是arguments 的一个属性成员,它表示对函数对象本身的引用
// arguments.callee.length可以获取实参参数 //callee用处1 用来判断实际参数跟行参是否一致
function calleeLengthDemo(arg1, arg2) {
// callee表示当前正在执行的函数对象,其实是函数的一个实例化
alert(arguments.callee.toString());
if (arguments.length == arguments.callee.length) {
window.alert("验证形参和实参长度正确!");
return;
} else {
alert("实参长度:" + arguments.length);
alert("形参长度: " + arguments.callee.length);
}
}
//当函数被执行的时候,生成一个实例
calleeLengthDemo(1); //callee用处2 调用自身 - 比如递归函数
// 优点:这样就让代码更加简练。又防止了全局变量的污染
//如下是一个递归算法 - 计算 1+2+3+4+...+n
var fn=(function(n){
if(n>0) return n+arguments.callee(n-1);
return 0;
})(10);
alert('采用callee方式:'+fn); // 传统方式的缺点:
// 1,破坏了,零重复法则,当一旦函数名称更改,需要更改多处
// 2,fn是一个全局变量,fn内部一般使用局部bianliang,而这里是一个全局变量,这是一个潜在的全局变量污染
var fn=function(n){
if(n>0) return n+fn(n-1);
return 0;
}
alert('采用传统方式'+fn(10));
三、constructor
// 什么是构造函数 - -专门用于创建对象或者累的函数 -- 因为js中原来没有对象的概念,通过函数来间接实现面向对象
//我们将创建对象的时候那个函数称之为构造函数
//我们可以通过constructor属性获取某个对象的构造函数
//constructor 属性就是用来构造对象实例的函数引用 - 后面的知识点
//构造函数 创建的对象
function Student(name) {
this.name = name;
}
var zhangsan = new Student('张三');
if (zhangsan.constructor == Student)
document.write("zhangsan是根据构造函数Student创造(实例化)出来的"+"<br />"); //字符串对象
var str = new String("Hi");
if (str.constructor == String)
document.write("str是根据构造函数String创造(实例化)出来的"); // 输出:
// 学生类的构造函数是Student函数
// str的构造函数是String
四、prototype属性
// prototype属性 -- 原型创建对象的底层原理 - 重点 __proto__
//获取对象的原型。
//每一个构造函数都有一个prototype属性,指向另一个对象。
//这个对象的所有属性和方法,都会被构造函数的实例继承。
//这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。 // 目前只需要掌握通俗理解方式:对象的创建其实包含两个部分:构造函数部分,原型部分
// 当我们new一个对象的实例的时候,这个实例能够同时拥有构造函数对象和原型对象的属性和方法就是通过prototype属性来实现的
// 具体实现方式,下次详细讲解 //古代的男人
function Man(name, age) {
this.name = name;
this.age = age;
} //这里其实是两个对象 Man 和 Man.prototype
//这两个对象通过prototype属性实现关联
//关联后的结果,Man对象继承Man.prototype,从而使得Man拥有Man.prototype的所有属性和方法 Man.prototype.sex = "纯爷们";
//方法:战斗
Man.prototype.struggle = function () {
alert("方天画戟,赤兔,征战沙场!!");
} //实例化一个男人
var 吕布 = new Man("吕布", 20);
alert(吕布.sex);//纯爷们
吕布.struggle();//方天画戟,赤兔,征战沙场!! //古代女人
function Woman(name, age) {
this.name = name;
this.age = age;
}
Woman.prototype.sex = "小家碧玉";
Woman.prototype.zhibu = function () {
alert("织布 歌舞 琴棋书画");
}
var 貂蝉 = new Woman("貂蝉", 16);
alert(貂蝉.sex);//小家碧玉
貂蝉.zhibu();//d织布 歌舞 琴棋书画
第197天:js---caller、callee、constructor和prototype用法的更多相关文章
- 分析js中的constructor 和prototype
在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...
- 深入分析js中的constructor 和prototype
在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...
- JS中的constructor与prototype
http://www.cnblogs.com/qiantuwuliang/archive/2011/01/08/1930548.html 在学习JS的面向对象过程中,一直对constructor与pr ...
- 关于JS中的constructor与prototype
======================================================================== 在学习JS的面向对象过程中,一直对constructo ...
- 【JavaScript】关于JS中的constructor与prototype
最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...
- 【推荐】关于JS中的constructor与prototype【转】
最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...
- JS中的constructor 和 prototype
object.constructor :对象的constructor 属性引用了该对象的构造函数. //例如,用Array()构造函数创建了一个数组,那么a.constructor 引用的就是Arra ...
- JS - caller,callee,call,apply
在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]argument ...
- JS - caller,callee,call,apply [transfer] aA ==> apply uses an array [] as the second argument. call uses different argument.
在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]argument ...
随机推荐
- 20155315 2016-2017-2 《Java程序设计》第三周学习总结
教材学习内容总结 1.构造方法决定类生成对象的方式 用this将已存在的参数的值指定给此参数. 用new建立新的实例. class Clothes { String color; char size; ...
- WPF MVVM从入门到精通7:关闭窗口和打开新窗口
原文:WPF MVVM从入门到精通7:关闭窗口和打开新窗口 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 ...
- c#获取已安装的所有NET版本
/// <summary> /// 获取已安装的所有NET版本 /// </summary> /// <returns></returns> publi ...
- 【LG5019】[NOIP2018]道路铺设
[LG5019][NOIP2018]道路铺设 题面 洛谷 题解 \(NOIP\) 抄 \(NOIP\)差评 设当前做到了位置\(i\) 且\(h_i\) \(-\) \(h_i\)\(_+\)\(_1 ...
- 同一个电脑配置两个Git问题
拿到公司电脑后,正常配置gitlab,以及设置邮箱等等,可以使用公司邮箱,以及一系列设置 git config --global user.name "userName" git ...
- JMeter:全面的乱码解决方案【转】
本文是转自https://www.cnblogs.com/mawenqiangios/p/7918583.html 感谢分享者 中文乱码一直都是比较让人棘手的问题,我们在使用Jmeter的过程中, ...
- 测试Websocket建立通信,使用protobuf格式交换数据
接到一个应用测试,应用实现主要使用websocket保持长链接,使用protobuf格式交换数据,用途为发送消息,需要我们测试评估性能,初步评估需要测试长链接数.峰值消息数以及长期运行稳定性 整体需求 ...
- 【PMP考试专栏】01、五大过程组和十大知识领域
- js判断PC端 移动端 并跳转到对应页面
一.PC端跳转到移动端 html页面: <script>var webroot="/",catid="{$catid}",murl="m/ ...
- Tess4J -4.0.2- Linux 实践 [解决:Tess4J - Native library (linux-x86-64/libtesseract.so) not found in resource path]
[本文编写于2018年7月5日] Tess4J是Tesseract的Java JNA wrapper.本文介绍了在CentOS 7 操作系统中使用Tess4J的步骤及注意事项.在正式开始之前,先花一点 ...