1、require、export、module
require:函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头)。另外,模块名中的.js扩展名可以省略。以下是一个例子。
export:
对象是当前模块的导出对象,用于导出模块公有方法和属性。别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。以下例子中导出了一个公有方法。
exports.hello = function () {
console.log('Hello World!');
};
module:通过module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式,初始值是空对象。
exports.hello = function () {
console.log('Hello World!');
};
所有的require都是得到module.exports的内容,而不是exports的内容;
exports开始的时候是指向module.exports的;
所以说exports.sayHi()=function(){};看上去是给exports添加了一个方法,其实就是给module.exports添加了一个方法;也就是说exports是module.exports的代表,这个代表也可以指向别的指针了,所以来说一般exports就可以处理模块的引用了。
相应的如果我们需要导出一个类的时候 也是这样去导出 ,var clz = require(./hehe).clz; var c = new clz();
这样就可以了,但是我们每次都需要require以后再点出来名字比较费事,所以就直接的使用module.exprots而不使用exports了,可以理解为 module.exprots是一个对象{},原先的办法是设置这个对象的属性, 而现在直接替换了这个对象为某个类对象,这样不就不用写属性了么。
另记:module.exports 默认就是{} 也就是一个实例对象,所以moudle.exports 如果给它赋值 那么就是不能得到实例变量了,就是你赋值什么就是什么了,所以说module.exports = 类名;的时候就代表这个模块导出为一个类,exports就无效了,所以说非必须对象化的时候可以不使用。
其实感觉是module这个对象的exports这个对象就是一个导出对象,可以向这个对象添加,也可以直接替换这个对象,只是这个区别.反正require得到的都是module.exports这个对象.
2、prototype是一个对象,以默认值来实例化的对象,类对象有一个prototype,这个是对象的原型,__proto__指向prototype。
原型链都是以proto指向prototype的方式,进行指向传递,如果没有查找的属性没有就去proto里查找,如果还没有就继续去proto里找,直到object,object的proto指向null。
3、语法function:function xxx(){} 如果是匿名就直接是 function (){};
4、prototype语法的作用是给一个function添加方法 js里面认为function就是一个类,那么就相当于增加了方法。 其实prototype是复制目标类的所有方法和属性。
5、promise resolve是代表成功了,如果reject是代表失败了,失败了就不会继续执行,then返回promise是为了链式调用.
6、单引号和双引号的区别,双引号会判断引号内的内容是否有变量,有就输出值,如果没有就输出内容,所以如果是输出纯文本还是用单引号比较的有效率.
7、import与exports相对应,默认的认为exports某个方法\变量\类 ,只是局部导出,import的时候需要使用{}来进行读取对应的导出,整体模块的导入使用moudle xxx form 'xxxx', 默认模块导出使用export default xxxx,但是一个文件只允许使用一次.
8、在使用es6的时候,需要注意的是方法与class的绑定问题,如果需要在方法里面使用this引用就需要进行绑定类似这样this._onClick=this._onClick.bind(this);
9、async 在使用的时候,其实最小的粒度就是promise,await后面跟着的就是promise,然后await后面跟着的代码都是promise后的代码,那么咱们着都知道,其实就是promise为最小粒度这个思想能不能掌握,只有这样高度的去抽象才能简化代码.
array map 这个会顺序的去执行方法,参数就是元素的值,map方法是同步方法,而去执行的方法可以是耗时的,这样如果这个方法用async标识着 ,就说明这是一个返回promise的方法,所以这个数组就会变成一个promise数组,其他情况就是返回什么就什么类型的数组,这个需要注意;所以async不只是简单的一个方法 ,而可以真的理解为一个返回promise的方法,只要带async就代表着要返回promise了.可能这就是一个语法糖,快速的创建promise的语法.但是需要注意的是,虽然async会得到一个promise,但是必须要同步的返回值,这样才能成为一个promise,所以要是有一个耗时的操作,那么还是需要自己去创建一个promise.
10、this指向的问题,如果不开严格模式谁调用,就是谁的this,比如person.run();run里面打印this ,那就是person对象,如果是run();那打印的就是window,如果开着严格模式就打印undefined;在es6里使用()=>{}在这里打印this,就是跟随当前上下文的this的,而且不可以使用apply 、call来改变this,这个需要注意。
11、export 导出的必须要对应的名字来接,也就是导出的是一部分;export default 导出的是什么就是什么,而且都可以写作省略key的语法。需要注意一点的就是export导出的必须用对应的名字来接,而export default导出的就没有限制命名。
12、js作用域问题,函数内有个就近查找原则,就是会优先寻找函数内的变量,不管这个变量是在使用行的上面和下面,所以function aaa(){ alert(a); var a = 10; } 执行的时候会打印undefined。
网友评论