第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 ...
随机推荐
- linux 下c语言的pwd 实现
20155211实现mypwd 关于pwd 在Linux层次结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录.然而,没有提示符来告知用户目 ...
- 20155217 《Java程序设计》第三次实验报告
20155217 <Java程序设计>第三次实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...
- WPF 动画:同为控件不同命 - 简书
原文:WPF 动画:同为控件不同命 - 简书 1. 及格与优秀 读大学的时候,有一门课的作业是用 PPT 展示. 但是我们很多同学都把 PPT 当做 Word 来用,就单纯地往里面堆文字. 大家都单纯 ...
- MySQL入门篇(三)之my.cnf配置文件详解【转】
转自:https://www.cnblogs.com/panwenbin-logs/p/8360703.html #*** client options 相关选项 ***# #以下选项会被MySQL客 ...
- Swoole实现h5版聊天室笔记
声明:该聊天室目前只有一对多,一对一的聊天功能,另外,因为没有使用到mysql,所以还存在比较多的缺陷地方,但知道原理就差不多了,这里主要分享下swoole简易的聊天室制作思路. 开发环境:cento ...
- 抓包工具Charles学习总结
最近由于工作需要对App进行测试,功能方面还好说,但是在网络测试方面遇到了一些问题.由于公司App是使用https进行通信,直接在路由器上抓包下来,数据包都是加密的,没法看到接口返回的内容,给测试的B ...
- Django-建立网页
进入cmd模式做 django-admin startproject helloworld创建一个project,并命名helloworld,新生成的文件结构如下 输入python manage. ...
- TW实习日记:第八天
今天早上主要是接着做昨天的微信端网页预览附件,听同事说当打包代码放入服务器上后,就不存在跨域问题了,也就懒得自己写接口了,那么就希望自己能一次过吧...结果写着写着,发现开发文档中关于预览文件的方法, ...
- SQL Server变量杂谈
学习SQL的过程有进步的话还是一件很美妙的事情的 在第一家公司虽然只呆了两年,但是感觉是我进步最快的两年.那时候工作和生活都挺充实的,每天都有一点点的收获和付出,其中最大的收获莫过于掌握一些核心技能. ...
- python-property、__get__、__set__
目录 property __set__ 和 __get__ property property装饰器的应用来自这样一个问题:如果对实例的属性值不加以限制,那么实例的属性值会出现明显不合理的情况,为了解 ...