js面向对象笔记-2
defineProperty、call、apply、bind、闭包笔记
Object.keys获取对象属性名
Object.keys()可以用于获取对象自身的所有属性,类似与for…in,返回一个由属性名组成的数组。
1 | var obj = { |
Object.defineProperty方法
函数原型: Object.defineProperty(obj, prop, descriptor)
- obj:目标对象
- prop:需要定义或者修改的名字
- descriptor:目标属性所拥有的特性
其中 descriptor
是一个对象,里面可以包含:
- value:设置属性的值,默认undefined
- writable:值是否可重写,默认false
- enumerable:目标属性是否可被枚举,默认false
- configurable:目标是否服用被删除或者是否可以再次修改特性,默认false
1 | var obj = { |
所以如果想让某个方法的属性不能被遍历出来可以将 enumerable
设置成 false
或者默认。如果让某个属性不能被修改可以设置 writable
或者默认。同样不想让某个属性被删除可以设置 configurable
this指向
调用方式 | this指向 |
---|---|
普通函数 | windows |
构造函数 | 实例对象,包括原型对象的方法也是 |
对象方法调用 | 该方法所属对象 |
事件绑定方法 | 绑定该方法的对象 |
定时器函数 | windows |
立刻执行函数 | windows |
改变this指向
call
call()方法调用一个函数或者方法,可以通过传入值修改函数或者方法里this的指向。
函数使用: fun.call(thisArg, arg1, arg2, ...)
比如:
1 | var o = { |
apply
和call区别只有一个,就是不能传入后面的几个参数,只能传入一个数组。
1 | fun.apply(thisArg, [arg1, arg2, ...]) |
bind
也可以改变this指向,不过他不会立刻执行,而是返回一个修改this指向后的函数。
1 | var o = { |
高阶函数
高阶函数值这个函数能接收或者返回一个函数的函数(有套娃内味了)
比如:
1 | function calculate(op, x, y) { |
js不愧是动态语言,使用起来比c、go方便多了,go使用高级函数还得先为一些函数定义好函数原型才能用。
闭包
闭包是指某个函数有权访问另一个函数作用域中变量的函数。 ——JavaScript高级程序设计
1 | function func1() { |
c语言不能实现闭包的原因是因为在一个函数里不能访问另一个函数内的局部变量。