一、高级函数

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

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

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

  

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

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

2.作用域安全构造函数

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

  例如:

  1. function Person(name,age,job){
  2. if(this instanceof Person){
  3. this.name=name;
  4. this.age=age;
  5. this.job=job;
  6. } else {
  7. return new Person(name,age,job);
  8. }
  9. }
  10.  
  11. var person1=Person("Nicholas",29,"Software Engineer");
  12. alert(window.name) //""
  13. alert(person1.name) //"Nicholas"

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

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

3.惰性载入函数

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

4.函数绑定

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

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

  1.   function bind(fn,context){
  2.  
  3.     return function(){
  4.  
  5.       return fn.apply(context,arguments);
  6.     };
  7.   }

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

5.函数柯里化

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

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

  

  1. function curry(fn){
  2. var args = Array.prototype.slice.call(arguments,1);
  3. return function(){
  4. var innerArgs = Array.prototype.slice.call(arguments);
  5. var finalArgs = args.concat(innerArgs);
  6. return fn.apply(null,finalArgs);
  7. };
  8. }

二、防篡改对象

1.不可扩展对象

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

2.密封的对象

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

3.冻结的对象

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

JS复习:第二十二章的更多相关文章

  1. 第二十二章 Django会话与表单验证

    第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...

  2. 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记

    第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...

  3. Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  4. “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. “全栈2019”Java异常第二十二章:try-with-resources语句详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  6. “全栈2019”Java第二十二章:控制流程语句中的决策语句if-else

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. python 教程 第二十二章、 其它应用

    第二十二章. 其它应用 1)    Web服务 ##代码 s 000063.SZ ##开盘 o 26.60 ##最高 h 27.05 ##最低 g 26.52 ##最新 l1 26.66 ##涨跌 c ...

  8. 第二十二章 跳出循环-shift参数左移-函数的使用 随堂笔记

    第二十二章 跳出循环-shift参数左移-函数的使用 本节所讲内容: 22.1 跳出循环 22.2 Shift参数左移指令 22.3 函数的使用 22.4 实战-自动备份mysql数据库和nginx服 ...

  9. 20190925 On Java8 第二十二章 枚举

    第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法 ...

  10. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...

随机推荐

  1. openstack私有云布署实践【9.2 Glance镜像管理(办公网环境)】

    首先登录controller1创建glance数据库,并赋于远程和本地访问的权限.      mysql -u root -p   CREATE DATABASE glance; GRANT ALL ...

  2. 集合点(lr_rendezvous)

    含义: 当通过controller虚拟多个用户执行该脚本时,用户的启动或运行都不一定是同时的.集合点是在脚本的某处设置一个标记,当有虚拟用户运行到这个标记时,停下等待,知道所有用户到达这个标记处,再一 ...

  3. win8 or win7安装ubuntu双系统

    安装双系统的效果 现在使用win和linux双系统,整个环境相当方便好用,比如在Linux系统上,仍能访问NTFS(win的文件系统格式)中的文件和文档,当然win下的一些像matlab.vs等是不能 ...

  4. 为什么switch...case语句比if...else执行效率高

    在C语言中,教科书告诉我们switch...case...语句比if...else if...else执行效率要高,但这到底是为什么呢?本文尝试从汇编的角度予以分析并揭晓其中的奥秘. 第一步,写一个d ...

  5. gulp插件大全

    原文:http://www.mamicode.com/info-detail-517085.html No.1.run-sequence   作用:让gulp任务,可以相互独立,解除任务间的依赖,增强 ...

  6. SVN 版本控制工具

    1,安装完服务端VisualSVN Server和客户端TortoiseSVN 后,随便在一个文件夹下,右键,会看到有SVN checkout 选项,这个选项只有在第一次在仓库下下载的时候会用到: 1 ...

  7. .Net 第三方工具包整理

    抓取数据 Jumony (http://www.jumony.net/)是一个基于 .NET 技术,用 C# 编写的一个 HTML 引擎,其可以用来分析解读 HTML 文档中的数据,也可以修改和绑定数 ...

  8. JAVA环境变量配置详解

    JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解 Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLASSPATH.PATH. JAVA_HOME 指向 ...

  9. java Swing 如何添加点击可展开菜单控件( JMenuBar如何使用?)

    准备: JMenuBar  点击可展开控件本体 JMenu 点击可展开控件中的一级菜单 JMenuItem 点击可展开控件中的二级菜单 JFrame 程序运行时弹出的那个框框 这是一个使用点击可展开菜 ...

  10. 浅谈C#委托和事件

    委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本 ...