class(一)--类的创建
class是ES6引入的,它并不是一种全新的继承模式,而只是基于原型对象继承封装的语法糖,因此只要充分理解原型对象,原型链,继承等知识,class也就很好容易理解了
类的声明
ES5及之前是通过创建一个构造函数(Fn)以及将方法指派到该构造函数的原型对象(Fn.prototype)上,来创建一个类。
在ES6中类的声明就十分简单了,只要以class关键字开始, 接上类名, 最后将方法编写在花括号{}里面。(注意点:方法之间不需要逗号,方法之间不需要逗号,方法之间不需要逗号)
class Person {
// 等价于 Person构造函数
constructor(name) {
this.name = name;
}
// 等于Person.prototype.sayHello
sayHello() {
console.log(`Hello, my name is ${this.name}`);
}
}
let me = new Person('mxk');
console.log(me.name); // mxk
console.log(me.sayHello()) // Hello, my name is mxk
console.log(me instanceof Person) // true
console.log(typeof Person) //function
console.log(Object.getPrototypeOf(me) === Person.prototype) // true
console.log(Person.prototype.constructor === Person) // true
类表达式
匿名函数表达式
let Person = class {
constructor(name) { this.name = name; }
}
具名函数表达式
let Person = class Person1{
constructor(name) { this.name = name; }
}
与函数的声明和表达式不同,函数声明是会被提升的,但是类的声明和表达式都不存在提升,因此它们主要的不同就是代码风格
类的特点
- 类声明不会被提升,这与函数定义不同。类声明的行为与 let 相似,因此在程序的执行到达声明处之前,类会存在于暂时性死区内。
- 类声明中的所有代码会自动运行在严格模式下,并且也无法退出严格模式。
- 类的所有方法都是不可枚举的,而自定义类创建的方法默认是可枚举的
- 类的所有方法内部都没有 [[Construct]] ,因此使用 new 来调用它们会抛出错误。
- 调用类构造器时不使用 new ,会抛出错误。
- 不得修改类内部的类名
模拟类的创建
let/*不会被提升*/ Person /*外部可以访问的*/ = (function() {
"use strict"; /*运行在严格模式下*/
const /*不能修改内部的类名*/ Person1 = function(name) {
if (new.target === void 0) {
throw new Error('构造函数必须使用new');
}
this.name = name;
}
Object.defineProperty(Person1.prototype, 'sayHello', {
value: function() {
if (new.target !== void 0) {
throw new Error('类内方法调用不能使用new')
}
console.log(`Hello, my name is ${this.name}`);
},
enumerable: false, /*类内所有的方法都是不可枚举的*/
writable: true,
configurable: true
})
return Person1;
})();
类的声明和表达式基本是一致的,函数声明暴露给外部的类名和内部的类名是相同的,类表达式的话只有赋值符号左边的类名是我们可以访问的,右侧那个是内部的类名
立即调用类构造函数
let me = new class {
constructor(name) { this.name = name; }
sayHello() {
console.log(`Hello, my name is ${this.name}`);
}
}('mxk');
console.log(me.name) // mxk
console.log(me.sayHello()) // Hello, my name is mxk
使用这种模式你无法访问到类,因为外部可以访问的类名它并没有暴露出来
访问器属性
class Person {
constructor(name, age) {
this.name = name;
this.__age = age
}
get age() {
return this.__age;
}
set age(value) {
this.__age = value + 1;
}
}
相当于
Object.defineProperty(Person.prototype, 'age', {
enumerable: false, /*不可枚举*/
configurable: true,
get() { return this.__age; },
set(value) { this.__age = value + 1; }
})
静态成员
直接定义在构造函数对象上的方法,实例对象无法访问到
class ClassType {
constructor() {
this.type = 'class_type';
}
static create() {
return new ClassType();
}
}
let ct = ClassType.create();
console.log(ct.type); //class_type
console.log(ct.create); // undefined
class(一)--类的创建的更多相关文章
- C# 根据类名称创建类示例
//获得类所在的程序集名称(此处我选择当前程序集) string bllName = System.IO.Path.GetFileNameWithoutExtension(System.Reflect ...
- php简单实用的操作文件工具类(创建、移动、复制、删除)
php简单实用好用的文件及文件夹复制函数和工具类(创建.移动.复制.删除) function recurse_copy($src,$dst) { // 原目录,复制到的目录 $dir = opend ...
- 李洪强iOS开发之OC[013] -类的创建的练习
// // main.m // 12 - 类的创建练习 // // Created by vic fan on 16/7/9. // Copyright © 2016年 李洪强. All ri ...
- C++:类的创建
类的创建 #include<iostream> #include<cmath> using namespace std; class Complex //声明一个名为Compl ...
- 2--OC -- 类的创建与实例化
2.OC -- 类的创建与实例化 一.OC类的简述 1.OC类分为2个文件:.h文件用于类的声明,.m文件用于实现.h的函数: 2.类是声明使用关键字:@interface.@end : 3.类是 ...
- JAVA类的创建: 创建JAVA的类 ,JAVA的字段,JAVA类的方法
1. 创建Java的类 如果说Java的一切都是对象,那么类型就是决定了某一类对象的外观与行为.可是类型的关键字不是type,而是class,创建一个新的类型要用下面的代码: 1 2 3 class ...
- python 通过元类控制类的创建
一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...
- Day 5-7 exec 和元类的创建.
exec方法 元类 exec(str_command,globals,locals)参数1:字符串形式的命令参数2:全局作用域(字典形式). 如果不指定,默认globals参数3:局部作用(字典形式) ...
- Egret 类的创建和继承--TypeScript
class test extends egret.DisplayObjectContainer { /** * 类的创建 */ //属性 name: string; age: number; ts: ...
- 快速创建SpringBoot2.x应用之工具类自动创建web应用、SpringBoot2.x的依赖默认Maven版本
快速创建SpringBoot2.x应用之工具类自动创建web应用简介:使用构建工具自动生成项目基本架构 1.工具自动创建:http://start.spring.io/ 2.访问地址:http://l ...
随机推荐
- 使用element-ui组件el-table时需要修改某一行或列的样式(包含解决选择器无效问题)
在后台管理系统项目中,经常会使用element-ui中的组件el-table(表格)来展示列表数据. 当展示数据的时候,可能就需要给给某一行或者列设置特殊的样式,在查询文档是我遇到了一些问题:包括设置 ...
- I Hate it-HDU1754 点修改+区间最大值
题意: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.不管你喜不喜欢, 现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然, ...
- java程序中的经常出现的的异常处理课后总结
一.JDK中常见的异常情况 1.常见异常总结图 2.java中异常分类 Throwable类有两个直接子类: (1)Exception:出现的问题是可以被捕获的 (2)Error:系统错误,通常由JV ...
- Duilib自定义控件
新版博客已经搭建好了,有问题请访问 htt://www.crazydebug.com 在公司二期项目中为了将谷歌内核嵌入到duilib中,采用了自定义duilib控件的方法,由于也是第一次用duili ...
- ORACLE锁表问题
1.查询锁表的信息 select sess.sid,sess.serial#, lo.oracle_username,lo.os_user_name, ao.object_name,lo.locked ...
- 如何解决ajax跨域请求?
1.什么是跨域? a.域名不同 b.域名相同,端口不同 注:只有域名相同,端口相同时,才可以访问数据 可以使用jsonp解决ajax跨域请求的问题. 2.什么是jsonp? Jsonp其实就是一个跨域 ...
- vs2015中安装cplex攻略以及解决丢失cplex.dll问题
转:http://blog.sina.com.cn/s/blog_61f0374801014swp.html 按:相信配置过CPLEX的人大多有过痛苦而难忘的经历,本人亦不例外,纠结挣扎了一个下午加一 ...
- 「JSOI2008」Blue Mary的旅行
传送门 Luogu 解题思路 分层图加网络流,有点像这题 可以证明最多不超过100天,所以才可以分层,不然图的规模会很大. 首先连源点汇点: \((s,1,INF), (n, t, INF)\) 以时 ...
- IOS pin约束问题 存在间隙
今天在为自己的view添加约束 对比以前添加的约束时,发现有有两层淡红色线框一条实线和一条虚线,而以前一个demo中添加的则只有一个蓝色实线框. 今天添加的约束如图1所示: 图1 而以前添加约束如图2 ...
- IEEE Spectrum 2014年十大编程语言盘点
近日,IEEE Spectrum推出 了一个最流行的编程语言排行榜.排行榜筛选了 12 项指标,综合了 10 个来源(含 IEEE Xplore.Google.GitHub)的数据,最终评选出了下面这 ...