4.如果一个构造函数或类方法中有this , 那么它指向由该构造函数或类创建出来的实例对象 。
类和模块类的概念
JavaScript是一种弱类型语言 , 其本身并不像Java等语言那样对数据具有很强的类型区分 , 所以为了能够具有面向对象的编码风格 , 以其独有的方式实现了类的机制 。在JavaScript中 , 类的实现是基于原型(prototype)继承机制的 , 如果两个实例都从同一个原型对象上继承了属性 , 可以说它们是属于同一个类的实例 。类让每一个成员对象都共享某些属性 , 这种属性共享的方式在编程中占有举足轻重的地位 。
ES5中的类:在ES5中 , 类是由函数来定义的 , 定义类的函数称之为构造函数 。一般这类函数会以首字母大写的形式出现 , 普通的函数和方法都是以小写字母开头 , 对象实例化时通过new关键字来调用构造函数 。构造函数上挂载着一个prototype属性 , 该属性存放的是当前类的原型对象 , 原型对象是类的核心 , 用于为每一个实例对象提供公有属性 。原型对象中还拥有一个constructor属性 , 用于指向当前类的构造函数 。构造函数是类的“公共标识” , 而原型对象是类的“唯一标识” 。以下是一个类 , 用于表示点的坐标:
ES6中的类:在ES6中 , 类的表示就更具语义化 , 写法上更类似于传统的面向对象语言 。它引入了class关键字作为类的标识 , 并将ES5中prototype的constructor属性直接作为其内部的构造函数 , 并且在定义类方法时不需要添加function关键字 , 类方法之间也不需要用逗号进行分隔 。类中的静态方法和静态属性用static关键字表示 , 一旦类函数和类属性用static关键字标记后 , 实例对象将不会继承这些属性和方法 , 只能通过类本身来调用 。同样用ES6中的类来表示上述的例子:
模块化JavaScript模块化的历史由来已久 , 也并非小编用几行的篇幅就能一语带过 , 在这仅对它的特性及应用场景进行笼统的说明 , 如有对其原委感兴趣的读者 , 可以搜索其他更详细的相关资料 。
先来说CommonJS , CommonJS模块化规范主要应用于服务器端编程 , 加载模块的方式属于同步加载 , 只有在加载完成之后才能执行后续操作 。一个.js文件就是一个CommonJS模块 , 在服务器端的模块文件一般都保存在本地硬盘 , 所以加载速度较快 。每一个模块都有自己的作用域 , 里面定义的变量、函数、类都是私有的 , 对其他文件不可见 。NodeJS、webpack就是以CommonJS规范的形式来实现的 。
CommonJS模块特点:
所有代码都运行在模块作用域 , 不会污染全局作用域 。
模块可以多次加载 , 但是只会在第一次加载时运行一次 , 然后运行结果就被缓存了 , 以后再加载 , 就直接读取缓存结果 。要想让模块再次运行 , 必须清除缓存 。
模块加载的顺序 , 按照其在代码中出现的顺序 。在浏览器环境中 , 对于模块的下载很大程度上取决于网速的快慢 , 因此极有可能出现长时间等待现象 , 从而阻塞浏览器的渲染 。所以就必须采用异步模式(AMD、CMD) 。AMD模块规范采用异步加载方式 , 主要用于客户端浏览器环境下 , 但既可用于浏览器端也可用于服务端 , CMD则专注于浏览器端的模块化开发 。
AMD和CMD的区别:两者的区别在于对模块的加载和执行方式不同 , AMD会在加载完模块的同时去执行模块 , 从而拥有延迟低、效率高的特性;CMD则是加载完所有依赖模块后 , 再进入程序 , 遇到需要执行的模块才会执行相应的操作 。
requireJS是基于AMD规范实现的模块加载器
seaJS是基于CMD规范实现的模块加载器
继承上文说道 , 由于js本身并不像其他传统的面向对象语言那样 , 生来就具备类的概念 。所以在实现继承的同时 , 需要用到js的原型及prototype机制或Apply、call、bind方法来实现 。这里直接上码 , 介绍几种常见的继承方式:
类式继承
原型链继承
继承
函数式编程
JavaScript并不是专门的函数式编程语言 , 但却能够应用函数式编程技术 , 像对象一样去操控函数 。下面就例举一些JS函数式编程的典型应用:
推荐阅读
- 天风策略:18大科技细分行业重新划分 核心标的一览
- Docker三大核心组件:镜像、容器与仓库,你了解多少呢?
- Nginx为什么高效?一文搞明白Nginx核心原理
- C指针!
- 基本概念+优缺点+美团应用案例 一文看懂逻辑回归算法
- 特斯拉销量大增205%,股价狂飙 概念股大涨
- Javascript事件轮询
- 日照绿茶核心产区
- 信阳毛尖的核心产区有哪几个
- 1分钟读懂JavaScript、Ajax、jQuery全部知识点
