sunnychuai / blog

笔记
0 stars 0 forks source link

mm #5

Open sunnychuai opened 4 years ago

sunnychuai commented 4 years ago

一、JS 基础知识 闭包 原型 原型链 继承 New 关键字 1、创建一个空对象,并且this变量引用该对象,同时继承了该函数的原型 2、属性和方法被加入到this引用的对象中 3、新创建的对象由this所引用,并且最后隐式的返回this 1、创建一个空对象,作为要返回的对象实例 2、将这个空对象的原型,指向构造函数的prototype属性 3、将这个空对象赋值给函数内部的this关键字 4、开始执行构造函数内部的代码,如果函数内部有return 语句,而且return 后跟着一个对象,则返回return语句指定的对象;否则,就不管return 语句,返回this对象(新创建的空对象)。

this 指向 面向对象 设计模式 数组去重 Array.from(new Set([1, 2, 3, 3])) [...new Set([1, 2, 3, 3])] 排序算法

防抖函数

ES6 新语法 let 用来声明变量 只在let命令所在的代码块内有效。

symbol 新增原始数据类型,表示独一无二的值 JS的七种数据类型:字符串、数值、布尔值、对象、null、undefined、symbol 对象的属性名现在可以有两种类型,一种是字符串,另一种就是Symbol类型。

Proxy,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外面的访问进行过滤和改写。

var proxy = new Proxy(target, handler);

then方法,接受两个回调函数作为参数。第一个状态变为resolved时调用,第二个状态变为rejected时调用。返回一个新的Promise实例。

catch方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数。

getJSON('/post/1.json').then(function(post) {
  return getJSON(post.commentURL);
}).then(function(comments) {
  // some code
}).catch(function(error) {
  // 处理前面三个Promise产生的错误
});

finally方法用于指定不管Promise对象最后的状态如何,都会执行的操作。与状态无关,不依赖Promise的执行结果。

all方法用于将多个Promise实例,包装成一个新的Promise实例。

const p = Promise.all([p1, p2, p3])

p的状态由p1,p2,p3决定,分成两种情况

race方法将多个Promise实例包装成一个新的Promise实例。

const p = Promise.race(p1, p2, p3)

只要p1,p2,p3之中一个实例率先改变状态,p的状态就跟着改变。

Promise.resolve() 将现有对象转为Promise对象。

Promise.resolve("foo")
// 等价于
new Promise(resolve => resolve("foo"))

Promise.reject()方法也会返回一个新的Promise实例,该实例的状态为rejected。

const p = Promise.reject("出错了")
// 等价于
const p = new Promise((resolve, reject) => reject("出错了"))

Promise.reject()方法的参数,会原封不动的作为reject的理由,变成后续方法的参数

Iterator遍历器 一种接口,为各种不同的数据结构提供统一的访问机制。

async/await 是Generator函数的语法糖。 async 函数返回一个Promise对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

// 函数声明
async function foo () {}
// 函数表达式
cont foo = async function() {}
// 对象的方法
let obj = { async foo() {} };
// class的方法
class Storage {
    constructor() {
        this.cachePromise = caches.open("123");
    }

    async getAvatar(name) {
        const cache = await this.cachePromise;
        return cache;
    }
}
// 箭头函数
const foo = async () => {};

使用注意点

class Bar extends Foo { static classMethod() { return super.classMethod() + ", too"; } } Bar.classMethod(); // hello, too

实例属性
定义属性两种方式
- 定义在constructor()方法里的this上面
class IncreasingCounter {
    constructor() {
        this._count = 0;
    }
    get value() {
        return this._count;
    }
}
```

私有方法和私有属性 私有方法和私有属性,是只能在类的内部访问的方法和属性,外部不能访问。但ES6不提供,只能通过变通方法模拟实现。

Object.getPrototypeOf() 方法可以用来从子类上获取父类。因此可以用这个方法判断,一个类是否继承了另一个类。

Object.getPrototypeOf(ColorPointer) === Pointer // true

super关键字

原生构造函数

Module ES6模块的设计思是尽量静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。 CommonJs 和 AMD 模块都只能在运行时确定。

// CommonJs 模块
let { stat, exsits, readFile } = require("fs");

// 等同于
let _fs = require("fs")
let stat = _fs.stat;
let exists = _fs.exists;
let readFile = _fs.readFile;

上面实质是整体加载fs模块(加载fs所有方法),生成对象,然后再从这个对象上读取3个方法,这种加载称为“运行时加载”,因为只有运行时才能得到这个对象,导致完全没有办法在编译时做“静态优化”。

ES6模块不是对象,而是通过export 命令显式的指定输出的代码,在通过import命令输入。

import { stat, exists, readFile } from "fs";

上面的实质上是从fs模块加载3个方法,其他方法不加载,这种加载称为“编译时加载”或静态加载。

import { default as foo } from "modules" // 等同于 // import foo from "modules"

- import() 动态加载,返回一个Promise对象。
使用场景:
- 按需加载
button.addEventListener('click', event => {
    import('./dialogBox.js')
    .then(dialogBox => {
        dialogBox.open();
    })
    .catch(error => {
        /* Error handling */
    })
});
```

编写风格优化

浏览器输入网址后的过程 浏览器缓存 跨域的解决方案 Ajax 实现过程 正则表达式 二、框架 Vue vuex vue-router

React Redux / Mobx React-router

React Hooks

三、小程序

四、Nodejs 、Koa

五、Webpack

六、Typescript

七、Flutter

八、React-Native

面向对象 对象是实物的抽象,是一个容器,封装了属性和方法。 如果创建实例对象?

this 是属性或方法“当前”所在的对象。 函数中的this就是函数运行时所在的对象。

改变this指向

构造函数的缺点 同一个构造函数的多个实例之间,无法共享属性,造成对系统资源的浪费。 解决方案就是原型对象。

继承机制的设计思想就是 原型对象的所有属性和方法都能被实例对象共享。 原型对象的属性不是实例对象自身的属性,只要修改原型对象,变动就会体现在所有实例对象上。 实例对象就有某个属性或方法,不会再去原型对象寻找这个属性和方法。 原型对象的作用就是定义所有实例对象共享的属性和方法。

如何理解原型和原型链? 所有的对象都有自己的原型对象,一方面,任何对象都可以充当其他对象的原型;另一方面,由于原型对象也是对象,所以它也有自己的原型。因此就会形成一个“原型链”。 一层层追溯所有对象的原型最终都可以上溯到Object.prototype。也就是所有对象都继承了Object.prototype的属性,比如valueOf 和 toString方法。 而Object.prototype的原型是null。null 没有任何属性和方法,也没有自己的原型,因此,原型链的尽头就是 null。 读取对象的属性时,JS引擎先寻找对象本身的属性,找不到就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。如果对象自身和它的原型都定义一个同名属性,那么优先读取对象自身的属性。

constructor属性 prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数。 constructor属性的作用

instanceof 运算符 返回一个布尔值,表示对象是否为某个构造函数的实例。 原理:检查右边的构造函数的prototype属性,是否在左边对象的原型链上。 特殊情况,左边对象的原型链上,只有null对象时,instanceof 判断会失真。