JS学习梳理(二)this和对象原型
- jthis
- 作用域
- this 在任何情况下都不指向函数的词法作用域
- 当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包含函数在哪里被调用(调用栈)、函数的调用方法、传入的参数等信息。this 就是记录的其中一个属性,会在函数执行的过程中用到
- this 实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用
- this全面解析
- 调用位置,即调用栈
- 绑定规则
- 默认绑定
- 隐式绑定
- 显示绑定,call() apply()
- 硬绑定,ES5提供了Function.prototype.bind
- new绑定
- 优先级
- new绑定 > 硬绑定、显示绑定 > 隐式绑定 > 默认绑定
- 绑定例外
- var obj = Object.create(null)
- this词法,胖箭头函数
function foo() { setTimeout(() => { // 这里的this 在此法上继承自foo() console.log(this.a); }, 100); } var obj = { a: 2 }; foo.call(obj); // 2
ES6 中的箭头函数并不会使用四条标准的绑定规则,而是根据当前的词法作用域来决定this,具体来说,箭头函数会继承外层函数调用的this 绑定(无论this 绑定到什么)。这其实和ES6 之前代码中的self = this 机制一样
- 作用域
- 对象
- 主要类型:string, number, boolean, null, undefinded, object
- 内置对象(内置函数):String, Number, Boolean, Object, Function, Array, Date, RegExp, Error
- 内容
- 值访问,键访问
- 浅复制,深复制
- 属性描述符
Object.defineProperty(myObject, "propertyName", { value: 2, writable: true, configurable: true, enumerable: true });
- Get
对象默认的内置[[Get]] 操作首先在对象中查找是否有名称相同的属性,如果找到就会返回这个属性的值,否则遍历原型链。 - Put
- Setter, Getter
- 存在性
- in (原型链查找)
- Object.hasOwnProperty (对象内查找)
- Object.keys(..)(对象内查找)
- 遍历
var randoms = { [Symbol.iterator]: function () { return { next: function () { return { value: Math.random() }; } }; } }; var randoms_pool = []; for (var n of randoms) { randoms_pool.push(n); // 防止无限运行! if (randoms_pool.length === 100) break; }
- 混合对象“类”
function mixin(sourceObj, targetObj) { for (var key in sourceObj) { // 只会在不存在的情况下复制 if (!(key in targetObj)) { targetObj[key] = sourceObj[key]; } } return targetObj; }
- 原型
- Bar.prototype = Object.create(Foo.prototype)
- 类与对象