第197天:js---caller、callee、constructor和prototype用法

一、caller---返回函数调用者

 1 //返回函数调用者
 2 //caller的应用场景 主要用于察看函数本身被哪个函数调用
 3     function fn() {
 4 //判断某函数是否被调用
 5         if (fn.caller) {
 6             alert(fn.caller.toString());
 7         } else {
 8             alert("函数直接执行");
 9         }
10     }
11     function handleCaller() {
12         fn();
13     }
14     // fn被其他函数调用
15     handleCaller();
16     //fn没有被其它函数调用而是直接执行
17     fn();

二、callee---返回正被执行的 Function 对象

 1 // 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文.
 2 // callee是arguments 的一个属性成员,它表示对函数对象本身的引用
 3 // arguments.callee.length可以获取实参参数
 4 
 5 
 6 //callee用处1 用来判断实际参数跟行参是否一致
 7 function calleeLengthDemo(arg1, arg2) {
 8 //    callee表示当前正在执行的函数对象,其实是函数的一个实例化
 9     alert(arguments.callee.toString());
10     if (arguments.length == arguments.callee.length) {
11         window.alert("验证形参和实参长度正确!");
12         return;
13     } else {
14         alert("实参长度:" + arguments.length);
15         alert("形参长度: " + arguments.callee.length);
16     }
17 }
18 //当函数被执行的时候,生成一个实例
19 calleeLengthDemo(1);
20 
21 
22 //callee用处2 调用自身 - 比如递归函数
23 // 优点:这样就让代码更加简练。又防止了全局变量的污染
24 //如下是一个递归算法 - 计算 1+2+3+4+...+n
25 var fn=(function(n){
26     if(n>0) return n+arguments.callee(n-1);
27     return 0;
28 })(10);
29 alert('采用callee方式:'+fn);
30 
31 
32 // 传统方式的缺点:
33 // 1,破坏了,零重复法则,当一旦函数名称更改,需要更改多处
34 // 2,fn是一个全局变量,fn内部一般使用局部bianliang,而这里是一个全局变量,这是一个潜在的全局变量污染
35 var fn=function(n){
36     if(n>0) return n+fn(n-1);
37     return 0;
38 }
39 alert('采用传统方式'+fn(10));

三、constructor

 1 //    什么是构造函数 - -专门用于创建对象或者累的函数 -- 因为js中原来没有对象的概念,通过函数来间接实现面向对象
 2 //我们将创建对象的时候那个函数称之为构造函数
 3 //我们可以通过constructor属性获取某个对象的构造函数
 4 //constructor 属性就是用来构造对象实例的函数引用 - 后面的知识点
 5     //构造函数 创建的对象
 6     function Student(name) {
 7         this.name = name;
 8     }
 9     var zhangsan = new Student('张三');
10     if (zhangsan.constructor == Student)
11         document.write("zhangsan是根据构造函数Student创造(实例化)出来的"+"<br />");
12 
13 
14 //字符串对象
15     var str = new String("Hi");
16     if (str.constructor == String)
17         document.write("str是根据构造函数String创造(实例化)出来的");
18 
19     // 输出:
20     // 学生类的构造函数是Student函数
21     // str的构造函数是String

四、prototype属性

 1 // prototype属性 -- 原型创建对象的底层原理 - 重点  __proto__
 2 //获取对象的原型。
 3 //每一个构造函数都有一个prototype属性,指向另一个对象。
 4 //这个对象的所有属性和方法,都会被构造函数的实例继承。
 5 //这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。
 6 
 7 // 目前只需要掌握通俗理解方式:对象的创建其实包含两个部分:构造函数部分,原型部分
 8 // 当我们new一个对象的实例的时候,这个实例能够同时拥有构造函数对象和原型对象的属性和方法就是通过prototype属性来实现的
 9 // 具体实现方式,下次详细讲解
10 
11 
12 //古代的男人
13 function Man(name, age) {
14     this.name = name;
15     this.age = age;
16 }
17 
18 
19 //这里其实是两个对象 Man 和 Man.prototype
20 //这两个对象通过prototype属性实现关联
21 //关联后的结果,Man对象继承Man.prototype,从而使得Man拥有Man.prototype的所有属性和方法
22 
23 
24 Man.prototype.sex = "纯爷们";
25 //方法:战斗
26 Man.prototype.struggle = function () {
27     alert("方天画戟,赤兔,征战沙场!!");
28 }
29 
30 //实例化一个男人
31 var 吕布 = new Man("吕布", 20);
32 alert(吕布.sex);//纯爷们
33 吕布.struggle();//方天画戟,赤兔,征战沙场!!
34 
35 
36 //古代女人
37 function Woman(name, age) {
38     this.name = name;
39     this.age = age;
40 }
41 Woman.prototype.sex = "小家碧玉";
42 Woman.prototype.zhibu = function () {
43     alert("织布 歌舞 琴棋书画");
44 }
45 var 貂蝉 = new Woman("貂蝉", 16);
46 alert(貂蝉.sex);//小家碧玉
47 貂蝉.zhibu();//d织布 歌舞 琴棋书画

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

Java中的6颗语法糖

来源:http://blog.csdn.net/danchu/article/details/54986442 ? 语法糖(Syntactic Sugar),也...

35180
来自专栏落影的专栏

Swift学习笔记

这是一篇学习swift的笔记 Objective-C是很好的语言,Runtime机制、消息机制等也是爱不释手。 Swift一直在更新,闲暇时间学一遍。学习的B...

44770
来自专栏微信公众号:Java团长

谈谈Java中的语法糖

Java作为一种与平台无关的高级语言,当然也含有语法糖,这些语法糖并不被虚拟机所支持,在编译成字节码阶段就自动转换成简单常用语法。

12630
来自专栏机器学习入门

LWC 53:691. Stickers to Spell Word

LWC 53:691. Stickers to Spell Word 传送门:691. Stickers to Spell Word Problem: We ...

37350
来自专栏技术博客

C#字符串(字节)的长度

顺便看一下Sql Server中char nchar varchar  nvarchar

74120
来自专栏于晓飞的专栏

Java 泛型进阶

在 List<String> 中添加 Integer 将不会通过编译,但是List<Sring>与List<Integer>在运行时的确是同一种类型。

23430
来自专栏前端小作坊

Javascript 原型链

本来想写一篇“如何用JS实现面向对象”,发现自己对prototype原型链还是有很多的不理解的地方。先看一张原型链关系图:

14210
来自专栏杨熹的专栏

Day 1-Java-imooc-4.流程控制语句

课程地址:http://www.imooc.com/learn/85 总结图片来自 http://www.imooc.com/article/10535 ? 本...

36250
来自专栏彭湖湾的编程世界

【算法】实现栈和队列

栈(stack) 栈(stack)是一种后进先出(LIFO)的集合类型, 即后来添加的数据会先被删除 ? 可以将其类比于下面文件的取放操作:新到的文件会被先取走...

35660
来自专栏CodingToDie

Python学习(五):函数

第5 章 函数 Table of Contents 函数调用 数据类型转换 定义函数 空函数 返回多个值 tuple 函数调用 Python内置了很多有用的函数...

47550

扫码关注云+社区

领取腾讯云代金券