面向对象编程第三篇

instanceof关键字

判断构造函数的原型是不是在对象的原型链上
1
对象 instanceof 构造函数

创建函数的三种方式

函数声明

1
2
3
function 函数名(参数列表){
//函数体
}

函数表达式

1
2
3
var 函数名 = function (参数列表){
//函数体
}

Function

1
var 函数名 = new Function();

Function的使用

1
2
3
4
5
6

var func = new Function(); //创建空函数

var func1 = new Function(methodBody); //创建有函数体的函数,methodBody是一个字符串

var func2 = new Function(arg1, arg2...argN, methodBody) //创建一个以methodBody为函数体,之前所有的参数为形参名的函数, 所有的参数都是字符串!!

如何解决Function的函数体过长的问题?

  1. 字符串拼接
  2. 使用模板引擎
  3. 使用反引号

eval的使用

eval是个函数,可以将字符串转换成代码并立即执行!

1
eval(符合js语法规范的字符串);

使用eval处理JSON格式数据的时候的问题

当使用eval处理JSON格式数据的时候,eval会将JSON格式字符串中的大括号{},当做代码段来解析,所以会报错!

解决方案:

  1. 将变量声明也同时放在eval中

    1
    2
    3
    var jsonStr = "{key: value}";

    eval("var obj=" + jsonStr);
  2. 在json格式的字符串前后拼接小括号

    1
    2
    3
    var jsonStr = "{key: value}";

    var obj = eval("(" + jsonStr + ")");

JSON2

Function和eval的异同

  1. 都能将字符串转换成代码
  2. Funciton创建出来的是函数,需要手动去调用,代码才会执行,而eval会直接将字符串转成代码并执行

问题:

  1. 执行效率的问题
  2. 安全性问题(XSS)

函数的原型链

如果将函数当做一个对象对待的话,那么他也是由构造函数创建出来的,所以这个函数对象,也会有相应的原型链

js中所有的函数的构造函数都是Function, 包括Function本身

完整的原型链绘制

Object和Function的关系

可以通过instanceof关键字来确定两者的关系, Object和Function互为实例!!

arguments对象

arguments是函数内部的一个对象,他是一个伪数组
在函数调用的时候,会将函数的实参,依次的存入这个伪数组中。

arguments.length 属性,表示函数在调用的时候,传入的实参的个数
arguments.callee 属性,指的就是arguments对象所在的函数,一般用来在匿名函数中做递归

函数对象的成员

  • arguments
  • caller 函数的调用环境,如果是在全局,则为null,如果是在其他函数当中调用的,那么caller为所在的那个函数
  • length 函数的形参的个数
  • name 函数的名称 函数声明和函数表达式的函数名为正常的函数名,new Function创建出来的函数名为 anonymous

静态成员以及实例成员

  • 静态成员: 通过构造函数访问的成员就是静态成员
  • 实例成员: 通过实例去访问的成员就是实例成员