一、高级函数

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( )方法来冻结对象。

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. Santa Claus and Tangerines

    Santa Claus and Tangerines 题目链接:http://codeforces.com/contest/752/problem/E 二分 显然直接求答案并不是很容易,于是我们将其转 ...

  2. 【完全背包】HDU 1284 钱币兑换问题

    Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Out ...

  3. 集合点(lr_rendezvous)

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

  4. Mac OS 上 CRT 的终端设置

    这种设置完全是个人习惯, 切勿效仿!!!   整个终端是 白底黑字 显示方式(奇葩中的奇葩) 1) ANSI Color & Use color scheme 同时勾选 2) Characte ...

  5. B树、B-树、B+树、B*树详解

    注:本文为个人学习摘录,原文地址:http://www.blogjava.net/supercrsky/articles/185167.html B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿 ...

  6. 打印java堆栈信息

    使用如下命令: kill -3 {pid} 可以打印指定线程的堆栈信息到tomcat的catalina.out日志中.在性能测试过程中,可以观察响应时间的曲线,如果突然出现波峰则抓取当前时间点tomc ...

  7. python3 流程控制

    表达式if ... else >>> if 3 > 4: ... print('False') ... else: ... print('True') ... True 表达式 ...

  8. hdu1027

    #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const ...

  9. js---疑点代码段解析

    function count() { var arr = []; for (var i=1; i<=3; i++) { console.log("iii---"+i); ar ...

  10. ASP.NET用户控件操作ASPX页面

    定义一个不含数据的事件处理方法 用户控件 public event EventHandler Click; protected void Button1_Click(object sender, Ev ...