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);

作为对象的模板,通过class关键字,可以定义类,相当于创建一个 实例

 //定义类
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
} toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
typeof Point // "function"
Point === Point.prototype.constructor // true
//ES6 的类,完全可以看作构造函数的另一种写法。

可以看到里面有一个constructor方法,这就是构造方法,this则代表实例对象

ES5 的构造函数Point,对应 ES6 的Point类的构造方法。

定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。

类的数据类型就是函数,类本身就指向构造函数。 直接对类使用new命令,跟构造函数的用法完全一致。

构造函数的prototype属性,在 ES6的“类”上面继续存在。 事实上,类的所有方法都定义在类的prototype属性上面。

class Point {
constructor() {
// ...
} toString() {
// ...
} toValue() {
// ...
}
} // 等同于 Point.prototype = {
constructor() {},
toString() {},
toValue() {},
};

Object.assign方法可以很方便地一次向类添加多个方法:

 Object.assign(Point.prototype, {
toString(){},
toValue(){}
});
5// 类的内部所有定义的方法,都是不可枚举的 Object.keys(Point.prototype)
// [] es5 : ["toString"]
Object.getOwnPropertyNames(Point.prototype)
// ["constructor","toString"]

类的属性名,可以采用表达式。

let methodName = 'getArea';

class Square {
constructor(length) {
// ...
} [methodName]() {
// ...
}
}

类和模块的内部,默认就是严格模式 只要你的代码写在类或模块之中,就只有严格模式可用。 ES6 实际上把整个语言升级到了严格模式。

constructor方法

constructor方法是类的默认方法, 通过new命令生成对象实例时,自动调用该方法。

一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。 相当于es5 new Vue

 class Point {
} // 等同于
class Point {
constructor() {} //JavaScript 引擎会自动为它添加一个空的constructor方法。
}
// 等同于
new Point (){ }
constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。 class Foo {
constructor() {
return Object.create(null);
}
} new Foo() instanceof Foo
// false

类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行, 与 ES5 一样,类的所有实例共享一个原型对象。

 私有属性

表达式定义一个类

 const MyClass = class Me {
getClassName() {
return Me.name;
//这个类的名字是MyClass而不是Me,Me只在 Class 的内部代码可用,指代当前类。
}
};
//内部没用到Me的话可以省略Me
const YouClass = class {
//...
};
采用 Class 表达式,可以写出立即执行的 Class。 let person = new class {
constructor(name) {
this.name = name;
} sayName() {
console.log(this.name);
}
}('张三'); person.sayName(); // "张三"

不存在变量提升(hoist),必须保证子类在父类之后定义),这一点与 ES5 完全不同。

new Foo(); // ReferenceError
class Foo {}

继承类

{
let Foo = class {};
class Bar extends Foo {
//Bar继承Foo
}
}

私有方法

私有方法是常见需求,但 ES6 不提供,只能通过变通方法模拟实现。

有三种方法可模拟

//第一种
class Widget { // 公有方法
foo (baz) {
this._bar(baz);
} // 私有方法
_bar(baz) {
return this.snaf = baz;
} // _bar方法前面的下划线,表示这是一个只限于内部使用的私有方法 但是,在类的外部,还是可以调用到这个方法。
} //第二种
class Widget {
foo (baz) {
bar.call(this, baz);
} // 内部调用了bar.call(this, baz),成为了当前模块的私有方法
}
//私有方法移出模块
function bar(baz) {
return this.snaf = baz;
} //第三种
const bar = Symbol('bar');
const snaf = Symbol('snaf'); export default class myClass{ // 公有方法
foo(baz) {
this[bar](baz);
} // 私有方法
[bar](baz) {
return this[snaf] = baz;
} // 利用Symbol值的唯一性,将私有方法的名字命名为一个Symbol值。
};

私有属性的提案

方法是在属性名之前,使用#表示。

class Point {
#x=0;// 私有属性可以指定初始值,在构造函数执行时进行初始化。 constructor(x = 0) {
#x = +x; // 写成 this.#x 亦可
} get #x() { return #x }
set #x(value) { #x = +value }
#sum() { return #a + #b; } //私有方法 // #x是一个私有属性,它的读写都通过get #x()和set #x()来完成。 #x和x是两个不同的属性
}
//JavaScript 是一门动态语言,没有类型声明,使用独立的符号似乎是唯一的比较方便可靠的方法,能够准确地区分一种属性是否为私有属性。"@" 已经留给了 Decorator。

私有属性不限于从this引用,类的实例也可以引用私有属性

class Foo {
#privateValue = 42;
static getPrivateValue(foo) {
return foo.#privateValue;
}
} Foo.getPrivateValue(new Foo()); //
console.log(Foo.#privateValue) // 报错 //class 的取值函数(getter)和存值函数(setter)

class MyClass {
constructor() {
// ...
}
get prop() {
return 'getter';
}
set prop(value) {
console.log('setter: '+value);
}
} let inst = new MyClass(); inst.prop = 123;
// setter: 123 inst.prop
// 'getter'
 

Class 学习 (Es6阮一峰)的更多相关文章

  1. es6阮一峰读后感

    不经意间看了你一眼(阮一峰的es6读后感)我自己常用的 字符串篇:ES6 为字符串添加了遍历器接口(详见<Iterator>一章),使得字符串可以被for...of循环遍历.只要有遍历器接 ...

  2. flex布局学习总结--阮一峰

    基本概念:   采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器".它的所有子元素自动成为容器成员,称为 Flex 项目(flex it ...

  3. ES6 阮一峰阅读学习

    参考: ECMAScript6入门 就是随便看看,了解一下. 一.ECMAScript6简介 1. 什么是ECMAScript6? JavaScript语言的下一代标准.2015年6月发布,正式名称是 ...

  4. ES6(阮一峰) 数组的扩展

    1.扩展运算符 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(1, ...[2, 3, 4], 5) // ...

  5. ES6特性:(阮一峰老师)学习总结

    ES6(阮一峰)学习总结   1.块级作用域的引入 在ES6之前,js只有全局作用域和函数作用域,ES6中let关键字为其引入了块级作用域. { var a = 5; let b = 6; } con ...

  6. 关于阮一峰老师es6(第三版)中管道机制代码的理解浅析

    最近正在学习阮一峰老师的es6(第三版)教材,在学到第七章<函数的扩展>中的箭头函数嵌套时,文中提到了一个关于“管道机制”的示例,文中源代码如下: //es6(第三版)教材中的管道机制源代 ...

  7. 读阮一峰老师 es6 入门笔记 —— 第一章

    鉴于最近用 vuejs 框架开发项目,其中有很多涉及到 es6 语法不太理解所以便认真地读了一下这本书. 地址:http://es6.ruanyifeng.com/#README 第一章:let ,c ...

  8. 【js 笔记】读阮一峰老师 es6 入门笔记 —— 第一章

      鉴于最近用 vuejs 框架开发项目,其中有很多涉及到 es6 语法不太理解所以便认真地读了一下这本书. 地址:http://es6.ruanyifeng.com/#README 第一章:let ...

  9. 阮一峰 ES6

    阮一峰 ES6:http://es6.ruanyifeng.com/#docs/module

随机推荐

  1. tcpdump抓包工具用法说明

    tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包. 例如: ...

  2. express使用https

    目录 申请免费ssl证书 修改express的./bin/www 申请免费ssl证书 直接去阿里云申请一个免费的ssl,选择neginx下载证书就可以了,解压得到一个xxx.key.xxx.crt文件 ...

  3. dubbo设计实现的健壮性

    Dubbo 作为远程服务暴露.调用和治理的解决方案,是应用运转的经络,其本身实现健壮性的重要程度是不言而喻的. 这里列出一些 Dubbo 用到的原则和方法. 日志 日志是发现问题.查看问题一个最常用的 ...

  4. bzoj 3680(洛谷1337) 吊打XXX——模拟退火

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3680 https://www.luogu.org/problemnew/show/P1337 ...

  5. 为BindingList添加Sort

    最近在优化WPF性能时, 发现在特定条件下BindingList比ObservableCollection性能更高, 因为它提供Disable/Enable 更改通知的方法.这样我们可以不需要很频繁的 ...

  6. Spring读取加密属性文件处理--待整理

    引言:Spring框架俨然已经是目前Java WEB项目开发的一个宠儿,更有人将Spring, Struts,和Hibernage称之为Java WEB项目开发的3件利器.Spring的依赖.注入.A ...

  7. Moco框架jar下载地址

    1.打开url:http://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/0.10.0/ 2.下载最大的jar包,如下图所示:

  8. 关于REST的一些想法

    REST and RESTful 最近入手了REST,谈谈自己的体会. 所谓REST, 我觉得是一种网址的设计风格.过去我们用Struts 或Spring MVC 时从来没有考虑过URL的设计风格.所 ...

  9. CSU - 1580 NCPC2014 Outing(树形依赖+分组背包)

    Outing Input Output Sample Input 4 4 1 2 3 4 Sample Output 4 分组背包: for 所有的组k for v=V..0 for 所有的i属于组k ...

  10. webbrowser 控件实现WinForm与WebForm交互

    WebBrowser 控件可以让你装载Windows Form 应用程序中的 Web 网页和其它采用浏览器的文件.可以使用webbrowser 控件将现有的web框架控制项加入至 Windows Fo ...