zoukankan      html  css  js  c++  java
  • JS复习:第二十二章

    一、高级函数

    1.在任何值上调用Object原声的toString( )方法,都会返回一个[object NativeConstructorName]格式d字符串。每个类在内部都有一个[[Class]]属性,这个属性中就指定了上述字符串中的构造函数名。举个例子吧:

      alert(Object.prototype.toString.call(value));

      由于原声数组的构造函数与全局作用域无关,因此使用toString( )就能保证返回一致的值。利用这一点,可以创建如下函数:

      

    function isArray(value){
      return Object.prototype.toString.call(value)=="[object Array]";  
    }

      对于在IE中以COM对象形式实现的任何函数,isFunction( )都会返回false。

    2.作用域安全构造函数

      构造函数是一个使用new操作符调用的函数,但是如果不使用new操作符二十直接调用构造函数,函数内的this就会映射到全局对象上。解决这个问题的方法就是创建一个作用域安全的构造函数。

      例如:

    function Person(name,age,job){
       if(this instanceof Person){
          this.name=name;
          this.age=age;
          this.job=job;              
        } else {
              return new Person(name,age,job);
        } 
    }
    
    var person1=Person("Nicholas",29,"Software Engineer");
    alert(window.name)  //""
    alert(person1.name)  //"Nicholas"

      这段代码添加了一个检查并确保this对象是Person实例的if语句,它表示要么使用new操作符要么在现有的Person实例环境中调用构造函数。

     多个程序员在同一个面上写javascript代码的环境中,作用域安全构造函数就很有用了。

    3.惰性载入函数

      惰性载入表示函数执行的分支仅会发生一次。有两种实现惰性载入的方法,第一种是在函数被调用时再处理函数。第二种是在声明函数时指定适当的函数。

    4.函数绑定

      函数绑定要创建一个函数,可以在特定的this环境中以指定参数调用另一个函数。该技巧常常和回调函数与事件处理程序一起使用,以便在将函数作为变量传递的同时保留代码执行环境。javascript库实现了一个可以将函数绑定到指定环境的函数:bind( )。

      一个简单的bind( )函数接受一个函数和一个环境,并返回一个在给定环境中调用给定函数的函数,并且将所有参数原封不动传递过去。语法如下:

      function bind(fn,context){
    
        return function(){
    
          return fn.apply(context,arguments);
        };
      }

      只要是将某个函数指针以值得形式进行传递,同时该函数必须在特定环境中执行,被绑定函数的效用就凸显出来了。

    5.函数柯里化

      函数柯里化的基本方法和函数绑定是一样的:使用一个闭包返回要给函数。两者的区别在于,当函数被调用时,返回的函数还需要设置一些参数传入。

      创建柯里化函数的通用方式:

      

    function curry(fn){
        var args = Array.prototype.slice.call(arguments,1);
        return function(){
            var innerArgs = Array.prototype.slice.call(arguments);
            var finalArgs = args.concat(innerArgs);
            return fn.apply(null,finalArgs);
        };
    }

    二、防篡改对象

    1.不可扩展对象

      默认情况下,所有对象都是可以扩展的,任何时候都可以向对象中添加属性和方法。但是使用Object.preventExtensions( )方法可以改变这个行为,让你不能再给对象添加属性和方法。

    2.密封的对象

      密封对象不可扩展,而且已有成员的[[Configurable]]特性将被设置为false。这就意味着不能删除属性和方法,因为不能使用Object.defineProperty( )把数据属性修改为访问器属性,或者相反。要密封对象,可以使用Object.seal( )方法。

    3.冻结的对象

      最严格的防篡改级别是冻结对象。冻结对象既不可扩展又是密封的,而且对象数据属性的[Writable]特性会被设置为false。如果定义[[Set]]函数,访问器属性仍然是可写的。可以使用Object.freeze( )方法来冻结对象。

  • 相关阅读:
    [数据结构与算法]Note
    [C++]构造函数那些事
    [C++]constexpr函数
    [计算机系统]字/字节/位
    [C++]返回数组指针
    [C++]Top-level const/Low-level const
    [信号]预加重与去加重--转
    Smart solution of decode String
    ACE学习:
    模糊匹配算法
  • 原文地址:https://www.cnblogs.com/koto/p/5308856.html
Copyright © 2011-2022 走看看