第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程序设计》第十周学习总结
学习目标 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Java 密码技术相关API的使用 学习资源 Java和Android开发学习指南(第二版)(EPUBIT,,Jav ...
- libuv源码分析
项目开发过程中经常使用了基于libuv库封装的库接口来实现异步处理,一直没仔细研究过这些接口的内部如何实现,因此也就没有掌握它的设计思想.今天花了点时间研究了其事件循环内部的一些过程,总算有了一些理解 ...
- 记一次SpringBoot使用WebUploader的坑
问题: B/S通常都会涉及到文件的上传,普通文件上传使用文件框,后台接收文件即可 我遇到的问题是要开发一个大文件上传的功能,那就肯定要支持文件的分片 分析: 1.参考网上的资料后,通常的多文件和大文件 ...
- OpenCV中Mat操作clone() 与copyto()的区别
OpenCV中Mat操作clone() 与copyto()的区别 // Mat is basically a class with two data parts: the matrix header ...
- day2 RHCE
1.配置SELINUX 在system1和system2上要求SeLinux的状态为enforcing.要求系统重启后依然生效. server [root@server0 ~]# getenforce ...
- 【LG3206】[HNOI2010]城市建设
[LG3206][HNOI2010]城市建设 题面 洛谷 题解 有一种又好想.码得又舒服的做法叫线段树分治+\(LCT\) 但是因为常数过大,无法跑过此题. 所以这里主要介绍另外一种玄学\(cdq\) ...
- 【linux】vim常用快捷键(转)
原文链接:https://www.cnblogs.com/tianyajuanke/archive/2012/04/25/2470002.html 1.vim ~/.vimrc 进入配置文件 如果不知 ...
- javaweb(十)——HttpServletRequest对象(一)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- MySQL☞左外链接与右外连接
外链接查询:即要查询有关联关系的数据,还要查询没有关联关系的数据.(个人理解为:表A和表B两个关联的列中)如下图: emmm,简单的来说两个表的关联关系:book.bid=bookshop.id,他们 ...
- 技本功丨用短平快的方式告诉你:Flink-SQL的扩展实现
2019年1月28日,阿里云宣布开源“计算王牌”实时计算平台Blink回馈给ApacheFlink社区.官方称,计算延迟已经降到毫秒级,也就是你在浏览网页的时候,眨了一下眼睛,淘宝.天猫处理的信息已经 ...