JS学习梳理(二)this和对象原型

  1. 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 机制一样

  2. 对象
    • 主要类型: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;
        }
  3. 混合对象“类”
    function mixin(sourceObj, targetObj) {
        for (var key in sourceObj) {
            // 只会在不存在的情况下复制
            if (!(key in targetObj)) {
                targetObj[key] = sourceObj[key];
            }
        }
        return targetObj;
    }
  4. 原型
    • Bar.prototype = Object.create(Foo.prototype)
  5. 类与对象
posted @ 2018-04-09 19:42  C.Jun  阅读(194)  评论(0编辑  收藏  举报