JavaScript遗忘知识

发布于 2021-10-04  67 次阅读


Table of Contents
# Javascript 遗忘点
 
* 属性描述符
    * 原理
        * 可以使用Objecct.getOwnPropertyDescriptor进行访问
        * 可以使用Object.defineProperty配置
        * 严格模式下会生效
    * 值 value
        * 属性的值
    * 可写 writable
        * 可以修改属性的值
    * 可配置 configurable
        * 可以使用defineProperty 修改属性描述符
    * 可枚举 Enumerable
        * for ... in... 可以访问
* <span color:"red">原型、原型链、构造函数、实例</span>
    * 原型(对象):
        * 构造函数的prototype
        * 在自身找不到的对象,会在原型对象中查找
        * 默认会生成constructor对象,指向构造函数
    * 原型链:
        * 每个对象都有\_\_proto\_\_
        * 每个原型链都是对象,所以\_\_proto_\_连起来,就是原型链
    * 构造函数:
        * 在JavaScript中就是一个普通函数
        * constructor中指向构造该对象的函数
    * \_\_proto\_\_
        * 对象中存在
        * 指向构造函数的原型
    * constructor
        * 是原型对象中默认带有的属性,指向构造函数
        * 可以方便后续处理,比如判断是不是数组
 
## this 指针
 
* 为什么要用this
    * 写代码可以变得简洁,优雅
* this 绑定规则
    * 默认绑定
        * 严格模式
            * 绑定的是unidefined
        * 非严格模式
            * 绑定的是全局空间
            * nodejs和dom不同
    * 隐式绑定
        * 考虑上下文对象的调用
        * console.log() // 如果默认输出,会在console里面找变量
        * 隐式丢失
            * 对象引用值地址执行==>会丢失
            * 传递引用值为参数==>会丢失
    ``` Javascript
        function a(){
        console.log(a)
        };
        var a = 100;
        b ={
        a:10,
        bb:a,
        }
        //////////////////////////////
        var c = b.bb;
        c(); // 这里相当于还是默认绑定
        //////////////////////////////
        callable(b.bb) //也是相当于默认绑定
    ```
 
    * 显式绑定
        * 使用call和apply
        * 无法解决丢失绑定的问题
        * 硬绑定
        * 可以解决显示绑定丢失的问题
 
    ``` Javascript
        function foo(something) {
          console.log(this.a, something);
          return this.a + something;
        }
          // 简单的辅助绑定函数
        function bind(fn, obj) {
          return function() {
            return fn.apply(obj, arguments);
          };
        }
        var obj = {
          a:2
        };
    ```
 
    * new绑定
 
    ``` Javascript
    var bar = new foo(2);
    // new 绑定就是把新建的对象绑定到this
    ```
 
## JavaScript对象
 
* 对象的访问方式
       * 键访问
          * 对象[属性名] ==> 访问
          * 键访问支持动态变量名定义
          * 对象[getName()] = name
      * 属性访问
          * 对象.属性 ==> 访问
* 对象特性
    * 对象的原型
        * 指向另一个对象,该对象的属性继承自原型链指向的对象
    * 对象的类
        * 表示对象类型的字符串
    * 对象的扩招标记
        * 是否可以向对象添加新的属性
    * 对象的分类
       * 内置对象
          * ECMAscript规范对弈的对象或者类(数组,函数,日期)
      * 宿主对象
          * JavaScript嵌入web浏览器,web浏览器就是宿主
      * 自定义对象
          * 运行中的JavaScript创建的对象
      * 自有属性
          * 直接在对象中定义的属性
      * 继承属性
          * 从原型对象中继承过来的属性
* 创建对象的方式
    * 概述
        * new 可以创建
        * Object.create() 函数可以创建对象
        * 对象直接量 {}
                             * 就是用Python中定义字典的方式在JavaScript中创建对象
    * new 来创建对象
        * new 后面跟一个函数调用
        * 函数调用实际上就是一个构造函数 constructor
        * 构造函数用来初始化一个新创建的对象
  * 原型
      * 概述
          * 除了null,每一个对象斗与JavaScript相关联
      * 对象继承原理
          * 直接量创建的对象都继承自Object.prototype
          * new关键字创建的,都继承new对象的prototype(new Date //Date.prototype)
                                * Object.create()
* [立即执行函数](https://www.jb51.net/article/50967.htm)
    * 作用
        * 避免全局被污染
    * 函数声明
        * 函数声明会被提升
        * 函数声明外层加括号,是将函数声明转换成了函数表达式
        ``` Javascript
        function test(){}
        ```
    * 函数表达式
        * 函数表达式执行到语句才会进行处理函数
        * 函数表达式后面可以直接加括号进行执行
        ``` Javascript
        var test = function (){}
        var test = function (){}();//可以进行执行
        ```
    * 匿名函数
        * 匿名函数不能直接定义加括号执行
        ``` Javascript
        function (){}
        ```
 
    * 函数定义
 
        ``` javascript
        /**
        * 类型判断
        * 1、文件传参_=[] 这是想当于在全局定义了一个_ ,然后传递给函数
        * 2、传递的是一个{},这是一个引用类型,可以往里面添加数据
        */
        (function (_) {
        // 列举出可能存在的数据类型
        var types =
        "Array Object String Date RegExp Function Boolean Number Null Undefined".split(
        " "
        );
        console.log("this test");
 
        function type() {
        // 通过调用toString()函数,从索引为8时截取字符串,得到数据类型的值
        console.log("type" + this);
        return Object.prototype.toString.call(this).slice(8, -1);
        }
 
        for (var i = types.length; i--; ) {
        _["is" + types[i]] = (function (self) {
        return function (elem) {
        return type.call(elem) === self;
        };
        })(types[i]);
        }
        //   return _;
        })((_ = {}));
        _.isArray([1, 2]);
 
        ```
 
 
## 混合对象类
 
## 原型链