第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 ...
随机推荐
- GridView中加入//实现分页
要在GridView中加入//实现分页 AllowPaging="true" PageSize="10" // 分页时触发的事件 protectedvoid g ...
- Mybaits: MyBaits的xml文件中大于号和小于号的转义
< 小于号 < > 大于号 & & 和 & ' 单引号 ' " 双引号 "
- springboot入门之一:环境搭建(续)
在上篇博客中从springboot的入门到运行一个springboot项目进行了简单讲述,详情请查看“springboot入门之一”.下面继续对springboot做讲述. 开发springboot测 ...
- Python 装饰器备忘
def deco(attr): ''' 装饰器,共包含三层返回结构 \n 第一层:用于接收 @deco 的参数,此处的代码只在初始化装饰器时执行一次 \n 第二层:用于接收 function,此处的代 ...
- TeamViewer卡在正在初始化显示参数
在windows的mstsc远程桌面中打开teamviewer,远程桌面开着的时候可以连接teamviewer,但是当我断开mstsc之后,再用teamviewer连就连接不上了,一直都是正在初始化显 ...
- Siki_Unity_3-8_Lua编程(未完)
Unity 3-8 Lua编程 任务1&2&3:前言 课程内容: Lua从入门到掌握 为之后的xLua和其他热更新方案打下基础 任务4:Lua简介 Lua是轻量小巧的脚本语言--无需编 ...
- Scala基础知识笔记2
1 类 1.1 定义一个简单的类 1.2 field的getter 和 setter方法 感觉成员变量定义成 var 属性名=属性值即可, 不需要定义成 val 或者 private就行, // ...
- JAVA学习笔记--组合与继承
JAVA一个很重要的功能就是代码的可复用性,代码复用可以大大提升编程效率.这里主要介绍两种代码复用方式:组合和继承. 一.组合 组合比较直观,只需在新的类中产生现有类的对象,新的类由现有类的对象组成, ...
- Leetcode_2. Add_Two_Number
2. Add_Two_Number 用两个非空链表分别表示两个非负整数,链表的节点表示数字的位,链表头表示数字的低位,链表尾表示数字高位.求两个链表所表示数字的和. 比如: Input: (2 -&g ...
- sqlserver-查阻塞
模拟阻塞: 打开两个窗口: 窗口一: BEGIN TRANSACTION--开始事务 --等待1分钟 WAITFOR DELAY '00:1'; 窗口二: 查询阻塞:(当前被阻塞的进程id,不 ...