JavaScript:class类的实现方式及特点
在JavaScript开发中,我们通常会使用构造函数的方式来是实现实例对象的生成,代码如下:
function People(name, age) {this.name = name;this.age = age;
}
People.prototype.say = function () {console.log('hello');
}
var tom = new People('tom', 25);
但是在ES6中,新加了一个比较传统的概念---class(类),来作为对象的模板,通过class关键字,可以定义我们需要的类,具体语法如下:
class People {constructor(name, age) {this.name = name;this.age = age;}say() {console.log('hello');}
}
可以看到,定义一个类People,用到了constructor构造方法,constructor构造方法内的this指向的则是实例对象,所以可以大概得出一个结论:就是class定义类中的constructor构造方法跟我们通常定义实例对象的构造函数是类似的(即constructor构造方法 ≈ People构造函数)。还可以看到,我们给class类中定义了一个say()的方法,这里有个语法需要注意,就是在class类中定义方法时不需要添加function函数关键字,而且方法与方法之间,不能用逗号分隔。同时我们检测一下class类的属性:
class People {...};
console.log(typeof People); // function,属于引用类型中的函数类型
同样,检测与People.prototype.constructor与class People的关系:
People === People.prototype.constructor
判定的结果是true,也就是说明:class类本身就是一个函数类型,同时class类本身指向的就是构造函数。我们先看下calss类声明对象的实现过程是咋样的:
首先,创建一个我们需要的People函数:
var People = function () {}
然后,前面我们说到的class类中的constructor构造方法中的this指向的就是实例,所以这里的constructor实际上指的就是People,那我们给People添加name和age的两个属性如下:
var People = function () {function People(name, age) {this.name = name;this.age = age;}
}
接下来就是如何将People的属性方法值添加上去?上面我们有在类中添加say()方法,那么实现的过程,我们就会利用到Object.defineProperty来给function People添加属性方法,如下:
// 先定义一个添加对象属性的方法,利用Object.defineProperty
var defineProperties = function (target, props) {for (var i = 0; i < props.length; i++) {var descriptor = props[i];Object.defineProperty(target, descriptor.key, descriptor);}
}var People = function () {function People(name, age) {this.name = name;this.age = age;}// 给function People添加say属性方法defineProperties(People, [{key: 'say', value: function(){console.log('hello')}}]
}
最后就是调用并返回我们需要的实例对象People:
var People = function () {function People(name, age) {this.name = name;this.age = age;}// 给function People添加say属性方法defineProperties(People, [{key: 'say', value: function(){console.log('hello')}}]return People
}();
说完class类实现的方式,接下来说一些它的特点:
- class创建的类中的定义的所有方法,不能枚举
var a = Object.keys(People.prototype);
console.log(a); // []
- 定义一个类时候必须要有constructor方法,如果没有定义,会默认添加一个空的constructor
class People {} ---> class People {constructor(){}}
- 在使用class类声明实例的时候也需要在前面添加new关键字
class People {...};
var tom = new People('tom', 25);
关于class类的相关是实现原理及一些特性简单介绍到这里,有想更深入学习的有志青年可以去看下阮一峰大神关于ES6新增特性的讲解,有不足之处,还望各位多多指点!
JavaScript:class类的实现方式及特点相关推荐
- 实现Javascript编写类的方式1(原生方式)
网上实现javascript写类的方法有很多, 总结下不外乎以下几种. 我自己学习总结了一下. 构造方法方式 原型方式 构造方法+原型的混合方式 现在具体分析一下以上方式的优缺点: 构造方法方式 这是 ...
- 【java】Java运行时动态生成类几种方式
1.概述 转载:Java运行时动态生成类几种方式 这里发现自己不知道的,原来Java 还能自己编译自己,学到了. 最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则.这就要求根据数据库数据动态生 ...
- 客户端控件Javascript验证类
客户端控件Javascript验证类 2005-09-20 javascritp一直是web开发的利器,在Ajax逐渐流行以后,javascript又更焕发活力.但是别误会,本文不讨论如何用javas ...
- 【JavaScript】类数组详解
[JavaScript]类数组详解 文章目录 [JavaScript]类数组详解 什么是类数组 类数组转换成数组 ES6 的方法转数组 callee属性 箭头函数没有arguments HTMLCol ...
- JavaScript Class类详解
ECMAScript 6 提供了更接近传统语言的写法,新引入的class关键字具有正式定义类的能力.类(class)是ECMAScript中新的基础性语法糖结构,虽然ECMAScript 6类表面上看 ...
- 【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )
文章目录 I . 类继承基本方式 II . 使用 final 禁止类继承 / 方法重写 III . 父类没有主构造函数 IV . 父类有主构造函数 V . 父类构造函数与子类构造函数总结 I . 类继 ...
- javascript 定义类(转载)
Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门 ...
- J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式[申明:来源于网络]...
J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式[申明:来源于网络] 地址:http://blog.csdn.net/sunhuaqiang1/arti ...
- javascript 常用类
javascript 常用类 2008-01-09 13:34 一.验证类 1.数字验证内 1.1 整数 1.2 大于0的整数 (用于传来的ID的验证) 1.3 负整数的验证 1.4 整数不能大于iM ...
最新文章
- 实战SSM_O2O商铺_15【商铺注册】View层+Controller层之图片上传
- visual studio 调试时提示 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。
- 企业日志分析ELK(Logstash+Elasticsearch+Kibana)介绍及搭建
- PHP生成缩略图函数
- Windows安装Apache注册服务出现(OS 5)拒绝访问。 : AH00369: Failed to open the Windows service manager,
- php 显示状态,php-fpm status状态配置显示
- AE进度条读取动画插件 LoadUP 1.71
- 开发者说丨如何从零开始构建一个轻量级应用
- RIP路由协议的理解
- 幸运的袋子(深度优先遍历(Depth First Search,DFS))
- ModelSim入门教程和两个典型例子
- 光学三原色与色的三原色
- 判断布尔值的一些规则
- 用计算机制作演示文稿教案博客,《创作演示文稿》教学设计
- 浮山中学2021年高考成绩查询入口,浮山中学2019年高考成绩通报,第二波震撼来袭...
- framemaker中遍历及判断其属性是否存在
- web前端程序员职位介绍
- 一张图片切割成九宫格,微信朋友圈发布
- 统计学习方法——知识点(1)经验分布
- HTML lable标签
热门文章
- linux 0.11 源码学习(十四)
- CentOS下使用Varnish为网站加速
- nginx请求如何映射url
- 配置文件中有“路径信息”时,需呀注意的问题(路径中的\是转义字符)~
- python 中基于 xlwings 处理 excel
- RK3288开发过程中遇到的问题点和解决方法之Packages
- 解决utf8编码的php生成csv打开乱码的问题
- 使用uploadify上传大文件报 IO error #2038错误的解决方案
- ubuntu系统没有声音解决方法
- Unity3D引用dll打包发布的问题及解决