Javascript使用函数apply扩展环境对象

Javascript使用函数apply扩展环境对象

通过实例对象作为参数传入调用构造函数对象的apply方法,
以使实例对象作为环境对象在作为一个普通函数的构造函数中执行,
构造函数的属性会覆盖到实例对象上,从而实现实例对象的属性扩展。

1.函数对象的apply和call传入参数

    var tag = "global"; 
    function say(){ 
        for(var args = "", i = 0; i < arguments.length; ++i) 
            args += arguments[i] + ","; 
        console.log(this.tag + ": " + args); 
    } 
    
    var obj = { 
        tag: "obj", 
        sayObj: function(){ 
            console.log(this.tag); 
        } 
    }; 
    
    /**apply接受环境对象和数组参数;call接受环境对象和打散的数组参数*/ 
    say.apply(obj, [1, 3, 7, 11]);//obj: 1,3,7,11,
    say.call(obj, 2, 4, [8, 14]);//obj: 2,4,8,14,
    say();//global
    /**obj对象内部的this还是指向Global的,对象内部的函数的this才会指向这个对象*/
    //obj.say(); //Uncaught TypeError: obj.say is not a function
    obj.sayObj(); //obj

2.只有函数对象才有apply方法调用

  var x = { 
      name: "x", 
      sayX: function(){ 
          console.log("x:" + this.name); 
      } 
  }; 
  var y = { 
      name: "y" 
  }; 
  
  /**调用的x对象的的sayX打印出x:x*/ 
  x.sayX(); //x:x
  /**普通的对象x上并没有apply方法以供调用*/
  //x.apply(y); //error: x.apply is not a function
  /**函数x.sayX在y对象的环境中执行,打印出x:y*/ 
  x.sayX.apply(y); //x:y
  /**在y中扩展的是sayX函数下的属性,而不是sayX本身*/
  //y.sayX(); //error: y.sayX is not a function

3.在函数对象上使用apply扩展其对象属性

    function X(){ 
        this.name = "x"; 
        this.age = 11; 
        this.say = function(){ 
            console.log(this.name); 
        } 
    } 
    
    function Y(){ 
        this.name = "y"; 
        this.color = "black"; 
    } 
    
    /**调用构造函数X返回一个实例x*/
    var x = new X(); 
    x.say(); //x
    console.log(x); //X {name: "x", age: 11, say: function()}
    /**用函数对象X中的属性扩展对象y*/
    var y = new Y(); 
    console.log(y); //Y {name: "y", color: "black"} 
    X.apply(y); 
    console.log(y); //Y {name: "x", color: "black", age: 11, say: function()}
    /**函数X在对象环境y中执行把name赋值为X中的值x*/ 
    y.say(); //x
    y.name = "y"; 
    y.say(); //y

4.原因是环境对象作为this执行了函数中的代码

    var name = "global";
    var obj = {
        name: "obj",
        callName: function(){this.foo = function(){
                console.log("欺骗了IDE");
            };
            console.log(this.name);
        }
    };

    obj.callName(); //obj
    /**当不传参数给apply时,默认全局环境作为第一个参数;同时全局也会获得原始环境中的属性*/
    obj.callName.apply();
    /**在原来的obj环境中运行函数,搜索到最近的值还是obj的属性name的值obj*/
    obj.callName(); //obj
    /**
     * 当没有执行上面的apply时,是会报错的;当然也不建议这样做
     * Uncaught ReferenceError: foo is not defined
     * 在执行apply时,运行了this.foo=...,这里的this在运行时指的是全局环境
     * 所以在下面执行foo时,会打印出     
     */
     foo();//欺骗了IDE

5.函数表达式模仿块级作用域避免全局变量冲突

    /**
     * 在通过圆括号把函数声明转化为函数表达式并立刻执行它
     * 这个函数内部的环境就是这个函数的环境,从而避免了全局变量冲突     */(function(){var person = {
            name: "Ameki",
            age: 18,
            sayHi: function(){
                alert("Hello, " + this.name);
            }
        };for(var prop in person){
            console.log(prop + ", " + person[prop]);
        }
    })();
    /* name, Ameki
     age, 18
     sayHi, function (){
             alert("Hello, " + this.name);
         }     
    */

如果你觉得本文对你有帮助,请点击右下方的推荐按钮,这样就可以让更多的小伙伴看到它了。

本文地址:http://www.cnblogs.com/kodoyang/p/Javascript_FunctionApply_ExtendEnvironmentObject.html

雨木阳子

2015年9月22日

时间: 2024-11-09 23:59:14

Javascript使用函数apply扩展环境对象的相关文章

JavaScript 没有函数重载&amp;amp;Arguments对象

对于学过Java的人来说.函数重载并非一个陌生的概念,可是javaScript中有函数重载么...接下来我们就进行測试 <script type="text/javascript"> //JavaScript不存在函数重载现象 var add=function(a,b){ return a+b; } var add=function(a,b,c){ return a+b+c; } <span style="white-space:pre">

javascript篇-----函数apply()和call()

转自:http://www.jb51.net/article/28013.htm 如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻. 如果在学JavaScript这自由而变幻无穷的语言过程中遇到这种感觉,那么就从现在形始,请放下的您的"偏见",因为这对您来说绝对是一片新大陆,让JavaScrip慢慢融化以前一套凝固的编程意识,注入新的生机! 好,言归正传,先理解JavaScrtipt动

Javascript事件函数传递的event对象参数

Event属性和方法: 1. type:事件的类型,如onlick中的click: 2. srcElement/target:事件源,就是发生事件的元素: 3. button:声明被按下的鼠标键,整数,1代表左键,2代表右键,4代表中键,如果按下多个键,酒把这些值加起来,所以3就代表左右键同时按下:(firefox中 0代表左键,1代表中间键,2代表右键) 4. clientX/clientY:事件发生的时候,鼠标相对于浏览器窗口可视文档区域的左上角的位置:(在DOM标准中,这两个属性值都不考虑

JavaScript Function 函数深入总结

整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下文,私有变量等知识点的深入理解. 函数中的return return 语句可以不带有任何返回值,在这种情况下( return; 或函数中不含 return 语句时),函数在停止执行后将返回 undefiend 值.这种用法一般在需要提前停止函数执行而又不需要返回值的情况下. return false

JavaScript 常用函数总结

javascript函数:  ·常规函数  ·数组函数  ·日期函数  ·数学函数  ·字符串函数 .cookie函数 1.常规函数 javascript常规函数包括以下9个函数:  (1)alert函数:显示一个警告对话框,包括一个OK按钮.  (2)confirm函数:显示一个确认对话框,包括OK.Cancel按钮.  (3)escape函数:将字符转换成Unicode码.  (4)eval函数:计算表达式的结果.  (5)isNaN函数:测试是(true)否(false)不是一个数字. 

javascript常用函数整理

javascript函数: 1.禁止鼠标右键菜单代码块 function stop() {     return false; } document.oncontextmenu = stop; //禁用鼠标右键 document.ondragstart = stop; //禁止拖动 document.onselectstart = stop; //禁止选择 2.判断打开的页面是否存在父页面 if (window.top == window.self && window.parent == 

【javascript】javascript常用函数大全

javascript函数一共可分为五类:   •常规函数   •数组函数   •日期函数   •数学函数   •字符串函数   1.常规函数   javascript常规函数包括以下9个函数:   (1)alert函数:显示一个警告对话框,包括一个OK按钮.   (2)confirm函数:显示一个确认对话框,包括OK.Cancel按钮.   (3)escape函数:将字符转换成Unicode码.   (4)eval函数:计算表达式的结果.   (5)isNaN函数:测试是(true)否(fals

JavaScript之jQuery-9 jQuery 开发插件(添加新全局函数、添加jQuery对象方法、添加新简写方法、方法参数)

一.添加新的全局函数 全局函数 - 全局函数,实际上就是jQuery对象的方法,从实践角度看,它们是位于jQuery命名空间内部的函数 - jQuery内置的某些功能是通过全局函数实现的 - $.ajax()函数就是典型的全局函数 - 向jQuery命名空间添加一个函数,只需要将这个新函数指定为jQuery的一个属性值   - 如果要使用该全局函数时,可通过一下代码调用 - 也可以通过别名来调用 添加多个函数 - 如果我们想在插件中提供多个全局函数,可以独立的声明这些函数   - 还可以使用$.

javascript 的bind/apply/call函数

javascript有三个使用频率非常高的内建函数:bind/apply/call.许多高级点的技巧都是基于这几个函数来实现的.这三个函数都用于改变函数的执行环境.从而达到代码复用的目的. 先来所说bind函数, bind,函数通常有两个用途: 1. 创建新函数,指定函数的this指针. name = 'global'; var obj1 = {name: 'foo'}; var showName = function() { console.log(this.name); } showName