1.class
ES6 供应了更靠近传统言语的写法,引入了 Class(类)这个观点,作为对象的模板。经由过程class关键字,可以定义类。
基础上,ES6 的class可以看做只是一个语法糖,它的绝大部分功用,ES5 都可以做到,新的class写法只是让对象原型的写法越发清楚、更像面向对象编程的语法罢了
特性
1.类的一切要领都定义在类的prototype属性上面
class Point {
constructor() {
// ...
}
}
==
Point.prototype = {
constructor() {},
};
2.Point.prototype.constructor === Point // true
3.定义“类”的要领的时刻,前面不须要加上function这个关键字,直接把函数定义放进去了就可以了
4.类不存在变量提拔(hoist),这一点与 ES5 完整差别。
5.类的要领内部假如含有this,它默许指向类的实例
6.假如在一个要领前,加上static关键字,就示意该要领不会被实例继续,而是直接经由过程类来挪用,这就称为“静 态要领”。
7.写法
ES5写法
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString = function () {
return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);
ES6
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
2.constructor( )——组织要领
这是ES6对类的默许要领,经由过程 new 敕令天生对象实例时自动挪用该要领。而且,该要领是类中必需有的,假如没有显现定义,则会默许增加空的constructor( )要领。
1.constructor要领默许返回实例对象(即this)
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
point.hasOwnProperty('x') // true
2.super( ) ——继续
在class要领中,继续是运用 extends 关键字来完成的。子类 必需 在 constructor( )挪用
super( )要领,不然新建实例时会报错。
在 constructor 中必需挪用 super 要领,由于子类没有本身的 this 对象,而是继续父类的 this 对象
,然后对其举行加工,而 super 就代表了父类的组织函数。super 虽然代表了父类 A 的组织函数,
然则返回的是子类 B 的实例,即 super 内部的 this 指的是 B,因而 super() 在这里相当于
A.prototype.constructor.call(this, props)。
class A {}
class B extends A {
constructor() {
super(); // ES6 请求,子类的组织函数必需实行一次 super 函数,不然会报错。
}
}
3.假如你在constructor中要运用this.props,就必需给super加参数:super(props);
3.ref 和 React.js 中的 DOM 操纵
顺带一提的是,实在可以给组件标签也加上 ref
<input ref={(input) => this.input = input} />//input为猎取的节点
4.react组件可内嵌组件或许节点道理
嵌套的构造在组件内部都可以经由过程 props.children 猎取到
class Card extends Component {
render () {
return (
<div className='Card'>
<div className='0'>
{this.props.children[0]}
</div>
<div className='1'>
{this.props.children[1]}
</div>
</div>
)
}
}
ReactDOM.render(
<Card>
<div>children[0]</div>
<div>children[1]</div>
</Card>,
document.getElementById('root')
)
5.默许设置 defaultProps&&给组件的设置参数加上范例考证
class LikeButton extends Component {
static defaultProps = {
likedText: '作废',
unlikedText: '点赞'
}
static propTypes = {
comment: PropTypes.object//const { comment } = this.props
}
static propTypes = {
comment: PropTypes.object.isRequired
}
}
6.react中bind(this)的明白
bind返回值是由指定的this值和初始化参数革新的原函数拷贝
在JSX中通报的事宜不是一个字符串,而是一个函数(如:onClick={this.handleClick}),此时onClick等于中心变量,所以处置惩罚函数中的this指向会丧失。处理这个题目就是给挪用函数时bind(this),从而使得不管事宜处置惩罚函数怎样通报,this指向都是当前实例化对象。
固然,假如不想运用bind(this),我们可以在声明函数时运用箭头函数将函数内容返回给一个变量,并在挪用时直接运用this.变量名即可
1
<button onClick={this.handleClick.bind(this)}>有bind点击一下</button>
2
constructor(props) {
super(props);
this.state = {
};
this.handleClick=this.handleClick.bind(this)
}
3
<button onClick={()=>{this.handleClick()}>
7.高阶组件
高阶组件是一个函数(而不是组件),它接收一个组件作为参数,返回一个新的组件。这个新的组件会运用你传给它的组件作为子组件
import React, { Component } from 'react'
export default (WrappedComponent, name) => {
class NewComponent extends Component {
constructor () {
super()
this.state = { data: null }
}
componentWillMount () {
let data = localStorage.getItem(name)
this.setState({ data })
}
render () {
return <WrappedComponent data={this.state.data} />
}
}
return NewComponent
}
import wrapWithLoadData from './wrapWithLoadData'
class InputWithUserName extends Component {
render () {
return <input value={this.props.data} />
}
}
InputWithUserName = wrapWithLoadData(InputWithUserName, 'username')
export default InputWithUserName
8.export&&import
模块功用主要由两个敕令组成:export和import。export敕令用于划定模块的对外接口,import敕令用于输入其他模块供应的功用。一个模块就是一个自力的文件。该文件内部的一切变量,外部没法猎取。假如你愿望外部可以读取模块内部的某个变量,就必需运用export关键字输出该变量
1.export敕令划定的是对外的接口,必需与模块内部的变量竖立一一对应关联
2.export语句输出的接口,与其对应的值是动态绑定关联,即经由过程该接口,可以取到模块内部及时的值
3.注重输出时{}的运用表明其是一个接口,不必则为值会报错
//export var year = 1958;
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;
export {firstName, lastName, year};
----------
// 报错
export 1;
// 报错
var m = 1;
export m;
----------
// 写法一
export var m = 1;
// 写法二
var m = 1;
export {m};
// 写法三
var n = 1;
export {n as m};
//函数
function f() {}
export {f};
4.import敕令接收一对大括号,内里指定要从其他模块导入的变量名。大括号内里的变量名,必需与被导入模块(profile.js)对外接口的称号雷同
5.假如想为输入的变量从新取一个名字,import敕令要运用as关键字,将输入的变量重命名
6.import敕令输入的变量都是只读的,由于它的实质是输入接口。也就是说,不许可在加载模块的剧本内里,改写
接口
7.注重,import敕令具有提拔结果,会提拔到全部模块的头部,起首实行
8.import是静态实行,所以不能运用表达式和变量
import { lastName as surname } from './profile.js';
import {myMethod} from 'util';//util是模块文件名,必需经由过程设置,通知引擎怎样取到这个模块
import 'lodash';//import语句会实行所加载的模块
9.模块的团体加载
除了指定加载某个输出值,还可以运用团体加载,即用星号(*)指定一个对象,一切输出值都加载在这个对象上面。
// circle.js
export function area(radius) {
return Math.PI * radius * radius;
}
export function circumference(radius) {
return 2 * Math.PI * radius;
}
import * as circle from './circle';
console.log('圆面积:' + circle.area(4));
console.log('圆周长:' + circle.circumference(14));
10.export default敕令,为模块指定默许输出
// export-default.js
export default function () {
console.log('foo');
}
// import-default.js
import customName from './export-default';
customName(); // 'foo'
1.运用export default时,对应的import语句不须要运用大括号
// 第一组
export default function crc32() { // 输出
// ...
}
import crc32 from 'crc32'; // 输入
// 第二组
export function crc32() { // 输出
// ...
};
import {crc32} from 'crc32'; // 输入
//连系运用
import _, { each, forEach } from 'lodash';
2.export default敕令实在只是输出一个叫做default的变量,所以它背面不能跟变量声明语句
// 准确
export var a = 1;
// 准确
var a = 1;
export default a;
// 毛病
export default var a = 1;
11.解构赋值
实质上,这类写法属于“形式婚配”,只需等号双方的形式雷同,左侧的变量就会被给予对应的值。下面是一些运用嵌套数组举行解构的例子
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3
let [ , , third] = ["foo", "bar", "baz"];
third // "baz"
let [x, , y] = [1, 2, 3];
x // 1
y // 3
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
1.假如等号的右侧不是数组(或许严格地说,不是可遍历的构造,拜见《Iterator》一章),那末将会报错
// 报错
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
2.解构赋值许可指定默许值
let [foo = true] = [];
foo // true
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
3.解构不仅可以用于数组,还可以用于对象
//浅易模子
let { bar, foo } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"
let { baz } = { foo: "aaa", bar: "bbb" };
baz // undefined
//基础模子
var robotA = { name: "Bender" };
var robotB = { name: "Flexo" };
var { name: nameA } = robotA;
var { name: nameB } = robotB;
nameA//"Bender"
nameB//"Flexo"
//多重解构
const node = {
loc: {
start: {
line: 1,
column: 5
}
}
};
let { loc, loc: { start }, loc: { start: { line }} } = node;
line // 1
loc // Object {start: Object}
start // Object {line: 1, column: 5}
//默许值
var {x, y = 5} = {x: 1};
x // 1
y // 5
var { message: msg = "Something went wrong" } = {};
//JavaScript 引擎会将{x}明白成一个代码块,从而发作语法毛病
//只要不将大括号写在行首,防止 JavaScript 将其解释为代码块,才处理这个题目
let x;
({x} = {x: 1});
//字符解构
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
12箭头函数
箭头函数没有 this,所以须要经由过程查找作用域链来肯定 this 的值。这就意味着假如箭头函数被非箭头函数包括,this 绑定的就是近来一层非箭头函数的 this。
没有 arguments
不能经由过程 new 关键字挪用
没有原型
没有 super
花样1:多个参数
(param1, param2, …, paramN) => { statements }
// statements应该有return 语句
(param1, param2, …, paramN) => expression
//相当于 return expression
花样2:一个参数
(singleParam) => { statements }
singleParam => { statements } //可以去掉括号
花样3:没有参数
() => { statements }
花样4:返回对象
params => ({foo: bar})
花样5:支撑扩大标记
(param1, param2, ...rest) => { statements }
花样6:支撑默许值
(param1 = defaultValue1, param2, …, paramN = defaultValueN) => { statements }
花样7:支撑解构赋值
var f = ([a, b] = [1, 2], {x: c} = {x: a + b}) => a + b + c; f(); // 6
13.Decorator润饰器运用//@connect道理
润饰器是一个对类举行处置惩罚的函数。润饰器函数的第一个参数,就是所要润饰的目的类。@是语法糖
1.类的润饰
function decorator(target) {
target.isTestable = true;
}
@decorator
class A {}
// 等同于
class A {}
A = decorator(A) || A;
A.isTestable//true
2.润饰器带参数
function testable(isTestable) {
return function(target) {
target.isTestable = isTestable;
}
}
@testable(true)
class MyTestableClass {}
MyTestableClass.isTestable // true
3.与redux库连系
class MyReactComponent extends React.Component {}
export default connect(mapStateToProps, mapDispatchToProps)(MyReactComponent);
//connect(mapStateToProps, mapDispatchToProps)返回一个函数
//加上()即(MyReactComponent),再次实行函数,传入一个组件返回一个被润饰的组件
==
@connect(mapStateToProps, mapDispatchToProps)//将props导入到被润饰的组件上去
export default class MyReactComponent extends React.Component {}