1.this的指向
1)函数的调用方式发生改变会导致this的指向发生改变
(1)函数作为对象的方法调用 this---->当前的对象
(2) 函数作为普通对象调用 this---->window
(3)使用new构造函数调用 this---->构造函数内部新创建的对象
(4)使用call | apply调用(函数上下问调用) this---->第一个参数
obj.showName.call(o,1,2);
2)this的丢失问题
以普通的函数调用,this指向window
2.Object.prototype属性
(1) constructor 指向对象的构造函数
(2)hasOwnProtperty 判断某个对象是否有某个属性(实例)
(3)isPrototypeOf 判断某个对象是否是指定对象的原型对象(判断的是一整条原型链)
(4)propertyIsEnumerable 是否可以枚举,可以枚举,就可以通过for...in遍历
Object.defineProperty(obj,'name',{
enumerable:false
})------>for...in遍历不到name
(5) toString 返回对象的字符串描述信息
1) 基本包装类型(String Number Boolean),返回对应的基本数据类型的字符串描述信息;
2) object对象,返回[object object];
3) 数组或者函数,返回对应的字符串形式;
4) Number对象可以传参,表示进制转换;
(6) toLocaleString 一般情况下和toString的用法一样,特殊情况下会做本地化处理
(7) valueOf 返回对应的值
1)基本包装类型,返回对应的基本类型数据;
2)object 类型,返回的是对象本身;
3)日期对象,返回时间戳
3.静态成员和实例成员
成员:属性+方法
(1) 静态成员:构造函数也是一个对象,也有自己的属性和方法(定义在构造函数上的属性和方法)
(2) 实例成员:直接定义在对象上的属性和方法(一般写在构造函数内,构造函数默认创建对象,this指向该对象)
(3) 原型成员:定义在原型对象上的属性和方法
4.Object的静态成员
(1)Object.apply 借用其他对象的方法
(2)Object.arguments 接收实参,保存实参,是一个对象,不是一个数组,是一个类似于数组的结构
(3)Object.assign 属性拷贝
(4)Object.call 借用其他对象的方法
(5)Object.caller 返回值是一个函数,返回调用该函数的函数
如果在全局作用域中调用,返回null不是window
(6)Object.constructor 指向构造函数(构造器属性)
(7)Object.create 创建对象,并且设置该对象的原型对象
(8)Object.getOwnPropertyDescriptor 获取属性的描述信息
(9)Object.defineProperty 定义属性并设置属性的描述对象
如果该属性已经存在,就默认是true
如果定义一个新的属性,默认是false
(10)Object.getOwnPropertyName 获取对象所有实例属性的名字,返回一个数组,不能获取原型属性
(11)Object.keys 获取对象所有属性的名字,不可以获取原型属性和不可以枚举的属性
(12)Object.getPrototypeOf 获取某个对象的原型对象
(13)Object.preventExtensions | Object.isExtensible 禁止扩展,不可以添加属性,但是可以修改删除属性
(14)Object.seal | Object.isSealed 密封对象,禁止扩展,不能删除,可以修改
(15)Object.freeze |Object.isFrozen 冻结对象,禁止扩展,不能删除,不能修改
5.Function构造函数的使用
创建函数的方式
(1)直接声明一个函数
(2)函数表达方式
(3)使用new
(4)使用new Function
处理参数过长问题
1)使用+拼接字符串
2)使用反括号``
3)使用JS模板
6.函数的隐藏参数
(1)arguements:接收实参,不是一个数组,是一个类似于数组的对象
(2)实参和形参
1)在函数调用的时候,会默认把实参赋值给形参,保存在arguments中
2)实参的个数大于形参,超出的可以通过arguments获取
3)实参的个数小于形参,会依次赋值,多余的形参是undefined
(3)arguments.length : 实参的长度
函数名.length : 形参的长度
7.caller和callee
caller : 返回一个函数,返回调用当前函数的函数,如果函数是在全局作用域中调用,返回null
callee : 函数的arguments对象有一个callee属性,返回函数自身,常用于递归调用
补充:递归调用
(1)自己调用自己
(2)有退出条件
求出1---n 的和
8.Function小应用(数组去重和求最大值)
去重:返回一个数组,数组中的元素不重复
indexOf:返回数组中的某个元素的索引,如果该元素不存在,就返回-1
求最大值:
9.Function.prototype原型链
10.Object和Function的关系(面试题)
(1)JS中所有的对象都是继承Object;
(2)Object和Function互为对方的实例;
11.eval函数
(1)作用:可以把字符串转化为对应的JS代码
(2)eval和Function
a . 都可以把字符串转为js代码;
b . eval转为代码后直接执行,Function需要调用才会执行;
(3)eval用于处理JSON数据
JSON数据:一种数据结构,用来表示数据,传输数据,本质是个字符串;
JSON数据的key必须是双引号;
(4)处理JSON数据:
a . 把JSON数据转为对象;
b . 把对象转为JSON数据;
eval用于处理JSON数据,不建议使用(js是词法作用域,eval函数可以动态的调整(破坏)词法作用域,性能不好)
12.with简单说明
(1)作用 : 可以把变量的作用域引申到{ }中
(2)使用注意点:
1)不能使用无前缀的方式添加属性
2)this指向window
3)在严格模式下,禁止使用
使用场合:当需要引用深层次的对象时可以缩短代码(对象.属性.属性......)不建议使用
13.私有变量和私有函数
直接写在构造函数内部的变量和函数称为私有变量和私有函数
特权方法:像text这样的实例方法,可以访问私有变量和函数,这个方法称为特权方法