一、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用法的更多相关文章

  1. 分析js中的constructor 和prototype

    在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...

  2. 深入分析js中的constructor 和prototype

    在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...

  3. JS中的constructor与prototype

    http://www.cnblogs.com/qiantuwuliang/archive/2011/01/08/1930548.html 在学习JS的面向对象过程中,一直对constructor与pr ...

  4. 关于JS中的constructor与prototype

    ======================================================================== 在学习JS的面向对象过程中,一直对constructo ...

  5. 【JavaScript】关于JS中的constructor与prototype

    最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...

  6. 【推荐】关于JS中的constructor与prototype【转】

    最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...

  7. JS中的constructor 和 prototype

    object.constructor :对象的constructor 属性引用了该对象的构造函数. //例如,用Array()构造函数创建了一个数组,那么a.constructor 引用的就是Arra ...

  8. JS - caller,callee,call,apply

    在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]argument ...

  9. JS - caller,callee,call,apply [transfer] aA ==> apply uses an array [] as the second argument. call uses different argument.

    在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]argument ...

随机推荐

  1. 20155224聂小益 2016-2017-2 《Java程序设计》第1周学习总结

    20155224聂小益 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 第一章内容不是很多,主要介绍了Java发展历程与Java的使用平台. JVM: ...

  2. 20155226 2016-2017-2 《Java程序设计》第2周学习总结

    20155226 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 了解了基本类型以及初识类类型,熟悉了注释,变量及运算符的使用. 了解了几种运算方式但还不算熟 ...

  3. SaltStack入门篇(四)之深入理解SaltStack远程执行

    1.目标 2.执行模块 3.返回 salt ‘*’ cmd.run ‘uptime’ 命令 目标 执行模块 执行模块参数 1.SlatStack远程执行–目标 执行目标:https://docs.sa ...

  4. 【redis的链接】redis的两种连接方法

    执行redis-server /etc/redis.conf开启服务 方法一: [root@zhangmeng ~]# redis-cli > > quit 方法二: [root@zhan ...

  5. SQL创建数据库、建表、填入内容

    --创建数据库 create database Information go --使用数据库 use Information go --创建表 create table Student ( Sno ) ...

  6. 使用SCSS扩展Bootstrap4

    摘要 因为打算写一个小网站,而个人时间又不是那么充裕,所以没有选择前后端分离的架构. 对于非前后端分离应用来说,Bootstrap应该是目前的最佳前端框架之一了. 而Bootstrap4,是Boots ...

  7. Spring学习(三)-----Spring自动装配Beans

    在Spring框架,可以用 auto-wiring 功能会自动装配Bean.要启用它,只需要在 <bean>定义“autowire”属性. <bean id="custom ...

  8. jvm之GC知识点

    GCRoots:        虚拟机栈(栈帧中的局部变量表)引用的对象       方法区中静态属性引用的对象       方法去中常量引用的对象       本地方法栈中JNI(NATIVE方法) ...

  9. Paper Reading - Mind’s Eye: A Recurrent Visual Representation for Image Caption Generation ( CVPR 2015 )

    Link of the Paper: https://ieeexplore.ieee.org/document/7298856/ A Correlative Paper: Learning a Rec ...

  10. [leetcode-908-Smallest Range I]

    Given an array A of integers, for each integer A[i] we may choose any x with -K <= x <= K, and ...