es6中的类及es5类的实现
类的特点
1.类只能通过new得到
在es6中类的使用只能是通过new,如果你将它作为一个函数执行,将会报错。
//es6的写法
class Child {
constructor() {
this.name = 1;
}
}
let child = new Child();
console.log(child.name)//1
//如果直接方法调用的形式,会报错
let child = Child();//Class constructor Child cannot be invoked without 'new'
es5中的class其实就是一个方法,没有关键字class
//es5中类的写法,但是这样直接用方法名调用并不会报错
var Person = (function () {
function Person(name) {
this.name = name;
}
Person.prototype.SayHello = function () {
window.alert("My name is " + this.name + ".");
};
return Person;
})();
var p = Person()//不报错
为了实现类似于es6中的调用检查,我们需要自己手写一个调用检查的函数。这个函数的原理就是用当前的this和构造函数进行比较,如果这个this指向的window,那么可以看出是用通过方法名直接调用的,如果this是构造函数那么就是通过new得到的
var Person = (function () {
//类的调用检测
function _classCheck(instance, constructor) {
if (!(instance instanceof constructor)) {
throw new Error('Class constructor Child cannot be invoked without new')
}
}
function Person(name) {
this.name = name;
_classCheck(this, Person)
}
Person.prototype.SayHello = function () {
window.alert("My name is " + this.name + ".");
};
return Person;
})();
var p = Person()
子类会继承父类的公有属性和静态方法
es6中的写法
//es6中的写法
class Child extends Person {
constructor() {
super()
this.name = 1;
}
}
//es5中的写法
var Clild = (function (Person) {
//类的调用检测
function _classCheck(instance, constructor) {
if (!(instance instanceof constructor)) {
throw new Error('Class constructor Child cannot be invoked without new')
}
}
//子类继承父类的方法
function _inherins(subclass, superclass) {
subclass.prototype = Object.create(superclass.prototype, { constructor: { value: subclass } })
Object.setPrototypeOf(subclass, superclass)
}
_inherins(Clild, Person)
function Clild() {
let obj=Person.call(this)//子类继承私有属性
let that=this;
if(typeof obj=='object'){
that=obj
}
that.name=1;//解决了父类是引用类型的问题
_classCheck(this, Clild)
return that
}
return Clild;
})(Person);
es6中的类及es5类的实现的更多相关文章
- ES5和ES6中对于继承的实现方法
在ES5继承的实现非常有趣的,由于没有传统面向对象类的概念,Javascript利用原型链的特性来实现继承,这其中有很多的属性指向和需要注意的地方. 原型链的特点和实现已经在之前的一篇整理说过了,就是 ...
- ES6中的类继承和ES5中的继承模式详解
1.ES5中的继承模式 我们先看ES5中的继承. 既然要实现继承,首先我们得要有一个父类. Animal.prototype.eat = function(food) { console.log(th ...
- ES6中。类与继承的方法,以及与ES5中的方法的对比
// 在ES5中,通常使用构造函数方法去实现类与继承 // 创建父类 function Father(name, age){ this.name = name; this.age = age; } F ...
- Nodejs与ES6系列4:ES6中的类
ES6中的类 4.1.class基本语法 在之前的javascript语法中是不存在class这样的概念,如果要通过构造函数生成一个新对象代码 function Shape(width,height) ...
- ES6中的类
前面的话 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScri ...
- 160803、如何在ES6中管理类的私有数据
如何在ES6中管理类的私有数据?本文为你介绍四种方法: 在类的构造函数作用域中处理私有数据成员 遵照命名约定(例如前置下划线)标记私有属性 将私有数据保存在WeakMap中 使用Symbol作为私有属 ...
- TypeScript完全解读(26课时)_8.ES6精讲-ES6中的类(进阶)
8.TypeScript完全解读-ES6精讲-类(进阶) 在index.ts内引入 Food创建的实例赋值给Vegetabled这个原型对象,这样使用Vegetables创建实例的时候,就能继承到Fo ...
- 深入ES6中的class类
今天在学习vuex时,遇到了定义store类时的一种写法,就是在类中的方法使用箭头函数绑定this的问题时的一种操作,感觉写法有点陌生,遂深究一番,好了上代码 此处写commit中的地方,是为了绑定t ...
- ES6中的class类的理解
传统的javascript中只有对象,没有类的概念.它是基于原型的面向对象语言.原型对象特点就是将自身的属性共享给新对象.这样的写法相对于其它传统面向对象语言来讲,很有一种独树一帜的感脚!非常容易让人 ...
随机推荐
- Android Studio模拟器的root权限
前言 一个安卓练习中用自带的sqlite3数据库查看数据的时候,需要通过adb shell进入/data/data/[包名]/databases/目录中,通过查看创建的数据库来查看相应的数据或者表.起 ...
- Flask虚拟环境连接mysql出现1366的解决方案
报错信息 Warning: (1366, "Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA...' for column 'VARIABL ...
- Django基础(1)
昨日内容回顾: 1. socket创建服务器 2. http协议: 请求协议 请求首行 请求方式 url?a=1&b=2 协议 请求头 key:value 请求体 a=1&b=2(只有 ...
- spring静态工厂方法得到单例bean
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationConte ...
- Scala_Load csv data to hive via spark2.1_via pass parameters
prepare csv: # vim /tmp/cars.csv year,make,model,comment,blank ","Tesla","S" ...
- CAS操作
CAS操作: Compare and Swap,比较并操作,CPU指令,在大多数处理器架构,包括IA32.Space中采用的都是CAS指令,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更 ...
- 转 MYSQL_GTID详解
http://blog.itpub.net/27067062/viewspace-2141906/ 一.GTID概述 GTID是MYSQL5.6新增的特性,GTID(Global Transac ...
- java Bean的映射工具
数据层,业务逻辑层和表现层,每一层对应的应该是不一样的对象,所以就有个这么个java bean的映射工具 dozer.......................................... ...
- awk 分解行、字段
1. 格式 格式: awk 'pattern {action} pattern {action}' filename 注:多个文件时,读取从左到右,读完第一个再读取第二个 pattern 1-/正则表 ...
- c# 类成员的定义 定义方法、字段和属性【转】
c# 类成员的定义 定义方法.字段和属性c#类的成员包括字段.属性和方法.所有成员都有自己的访问级别,用下面的关键字之一来定义:public----成员可以有任何代码访问:private----成员只 ...