es5继承和es6类和继承
es6新增关键字class,代表类,其实相当于代替了es5的构造函数
通过构造函数可以创建一个对象实例,那么通过class也可以创建一个对象实列
/* es5 创建一个person 构造函数 */
function person (name,age) {
this.name = name
this.age = age
}
/* 定义原型链上的方法sayholle */
/* 为什么要将方法定义在原型上,定义在原型上的方法,所有的实例对象都共享
不会出现没实列一个对象都重新创建一个这个方法 */
person.prototype.sayholle = function () {
console.log(this.name+' holle'+ this.age)
} let person1 = new person('czcz','23')
person1.sayholle() // czcz holle23 /* es6 使用class创建一个对象 */
class personclass {
/* 实列对象时默认调用的方法 */
constructor (name,age) {
this.name = name
this.age = age
}
/* 定义一个方法,相对构造上述原型链上的方法 */ sayholle () {
console.log(this.name+' holle'+ this.age)
}
}
let person2 = new personclass('czcz','26')
person2.sayholle() // czcz holle23
es5中继承的方式
1原型链继承
/* es5原型链继承 */
function person (name,age) {
this.name = name
this.age = age
}
person.prototype.sayholle = function () {
console.log(this.name+' holle'+ this.age)
} function child (sex) {
this.sex = sex;
}
child.prototype = new person();
child.prototype.hh = 'ddd'
let p = new child('man')
console.log(p) //
console.log(new person());
let p2 = new child('man')
p2.__proto__.age = '36'
/* 给p2原型上的age赋值,则导致p上的age也改变,父类构造函数上的属性被所有子类共享 */
console.log(p) //
/* 缺点,child 新增的属性只能在new person 以后,创建实列时无法向
父类的构造函数传送参数,因为直接是指定了原型,所有也不能实现多继承
父类构造函数上的属性被所有子类共享
*/
2.构造函数继承
/* es5构造函数继承 */
function person (name,age) {
this.name = name
this.age = age
}
person.prototype.sayholle = function () {
console.log(this.name+' holle'+ this.age)
}
function child (sex,name,age) {
this.sex = sex
person.call(this,name,age)
} let p = new child('man','czklove','13')
console.log(p);
/*
可以是先多继承,只要执行多个call
创建实列时能像父类构造函数船体参数
不会出现父类属性,所有子类构造函数共享
缺点,
不能继承父类原型链上的方法,如上面不能掉用sayholle方法
子类构造函数的实列,原型链上并不存在父类构造函数,
因为不能继承父类原型链上的函数,所有要继承函数只能定义在父类构造函数上,
不能达到函数复用
*/
3.组合继承,融合了上面两种方式
/* es5组合继承 */
function person (name,age) {
this.name = name
this.age = age
}
person.prototype.sayholle = function () {
console.log(this.name+' holle'+ this.age)
}
function child (sex,name,age) {
this.sex = sex
person.call(this,name,age)
}
child.prototype = new person();
/* 重新设置一下constructor 不设置也没有影响,严谨的角度上来说还是设置一下*/
/* 不设置的话,__proto__ 上时没有 constructor */
/* 正常来讲constructor是指向自身的 */
child.prototype.constructor = child;
let p = new child('man','czklove','13')
let p1 = new child('man','czklove1','16')
p.sayholle(); // czklove holle13
console.log(p);
- child {sex: "man", name: "czklove", age: "13"}
- age: "13"
- name: "czklove"
- sex: "man"
- __proto__: person
- age: undefined
- constructor: ƒ child(sex,name,age)
- name: undefined
- __proto__: Object
console.log(p.__proto__ === child.prototype) //true
4.优化版的组合继承(寄生组合继承)
/* es5寄生组合继承 */
function person (name,age) {
this.name = name
this.age = age
}
person.prototype.sayholle = function () {
console.log(this.name+' holle'+ this.age)
}
function child (sex,name,age) {
this.sex = sex
person.call(this,name,age)
}
child.prototype = Object.create(person.prototype);
child.prototype.constructor = child
let p = new child('man','czklove','13')
p.sayholle(); // czklove holle13
console.log(p);
/* child {sex: "man", name: "czklove", age: "13"}
age: "13"
name: "czklove"
sex: "man"
__proto__: person
constructor: ƒ child(sex,name,age)
__proto__:
sayholle: ƒ ()
constructor: ƒ person(name,age)
__proto__: Object */
es6 class
1.1class 内部都是严格模式
1.2class 不存在变量提升
1.3 class 的 name属性
1.4 实现symbol.iterator 接口,可以使用for of 遍历属性
1.5this 指向实例内部
关于class的基本介绍,去阮一峰老师的es6入门看就行 http://es6.ruanyifeng.com/#docs/class
es6 class的继承
/* esl class */
class person {
constructor (name,age) {
this.name = name
this.age = age
}
syaholle () {
console.log(this.name+ ' holle '+this.age)
}
} class child extends person {
constructor (name,age,sex) {
/* 执行父类的构造函数
子类必须在构造函数中掉用super
*/
super(name,age)
/* 使用this一定要在super 之后 */
this.sex = sex
}
} let p = new child('czklove','23','man')
console.log(p)
/* child {name: "czklove", age: "23", sex: "man"}
age: "23"
name: "czklove"
sex: "man"
__proto__: person
constructor: class child
__proto__:
constructor: class person
syaholle: ƒ syaholle()
__proto__: Object */
/* esl class */
class person {
constructor (name,age) {
this.name = name
this.age = age
}
syaholle () {
console.log(this.name+ ' holle '+this.age)
}
} class child extends person {
constructor (name,age,sex) {
/* 执行父类的构造函数
子类必须在构造函数中掉用super
*/
super(name,age)
/* 使用this一定要在super 之后 */
this.sex = sex
}
} let p = new child('czklove','23','man')
console.log(p)
/* child {name: "czklove", age: "23", sex: "man"}
age: "23"
name: "czklove"
sex: "man"
__proto__: person
constructor: class child
__proto__:
constructor: class person
syaholle: ƒ syaholle()
__proto__: Object */
es6 class 还涉及到很多东西,
1.静态方法
2.this指向
3.super 关键字的具体使用
4.类的prototype属性,构造函数的__proto__
5.原生构造函数的继承,如Array的继承,Boolean,Number,String Date...
基础简单的这里就不说了
我们再看以下原生构造函数的继承
es5中是不允许原生构造函数的继承的
/* es5为什么不能对原生构造函数的继承
通过es5继承我们知道,继承父类构造属性是通过person.call(this,argument)
(es6)
是因为子类无法获得原生构造函数的内部属性,
通过Array.apply()或者分配给原型对象都不行。
原生构造函数会忽略apply方法传入的this,也就是说,
原生构造函数的this无法绑定,导致拿不到内部属性
*/
/* es6 使用class继承原生 */ class myarray extends Array {
constructor(...argus) {
super(...argus)
}
} let arrays = new myarray();
arrays[0] = 'czklove';
console.log(arrays);
arrays.length = 0
console.log(arrays); /* 输出
myarray ["czklove"]
myarray [] */
注,es6对object构造函数的继承,不能传参,传参数无效
class newobjext extends Object {
constructor() {
super(...arguments)
}
}
let o = new newobjext({name: 'czklove'})
console.log(o.name); // undefined
总结,
es5的继承
1.1原型链继承
1.2 构造函数继承
1.3组合继承
1.4寄生组合继承
es6 的 extends 继承
super 关键字的使用,新增的静态字段使用,支持对原生构造函数的继承,对object继承的差异
es5继承和es6类和继承的更多相关文章
- typescript - 4.es5与typescript的类与继承
ES5中的类与类的继承 (1)简单的类 function Person() { this.name = '张三'; this.age = 20; } var p = new Person(); ale ...
- 04面向对象编程-02-原型继承 和 ES6的class继承
1.原型继承 在上一篇中,我们提到,JS中原型继承的本质,实际上就是 "将构造函数的原型对象,指向由另一个构造函数创建的实例". 这里,我们就原型继承的概念,再进行详细的理解.首先 ...
- C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}
C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...
- ES6类的继承
ES6 引入了关键字class来定义一个类,constructor是构造方法,this代表实例对象. constructor相当于python的init 而this 则相当于self 类之间通过ext ...
- 类ExampleA继承Exception,类ExampleB继承ExampleA。 有如下代码片断:
try { throw new ExampleB("b") } catch(ExampleA e){ System.out.println("ExampleA" ...
- 类Exception_A继承Exception,类Exception_B继承Exception_A,请问执行此段代码的输出是什么?
@Test public void Test_Exception() { try { throw new ExceptionB("A"); } catch (ExceptionA ...
- 精读JavaScript模式(八),JS类式继承
一.前言 这篇开始主要介绍代码复用模式(原书中的第六章),任何一位有理想的开发者都不愿意将同样的逻辑代码重写多次,复用也是提升自己开发能力中重要的一环,所以本篇也将从“继承”开始,聊聊开发中的各种代码 ...
- JS原型继承和类式继承
前言 一个多月前,卤煮读了一篇翻译过来的外国人写的技术博客.此君在博客中将js中的类(构造)继承和原型继承做了一些比较,并且得出了结论:建议诸位在开发是用原型继承.文中提到了各种原型继承的优点,详细的 ...
- JavaScript中的类式继承和原型式继承
最近在看<JavaScript设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...
随机推荐
- sh_03_程序计数
sh_03_程序计数 # 打印 5 遍 Hello Python # 1. 定义一个整数变量,记录循环次数 i = 0 # 2. 开始循环 while i < 3: # 1> 希望在循环内 ...
- 【Leetcode】二进制求和
解题思路: 1. 首先在两个字符串前面补‘0’,使它们等长.否则要一直监督操作是否超出两个字符串的索引. 2. 从后向前遍历所有位数,同位相加.字符相加,利用ASCII码,字符在内部都用数字表示,我们 ...
- 源码阅读-Kingfisher
最后更新:2018-01-16 使用教程: 官方的链接 使用 Kingfisher 处理网络图片的读取与缓存 1. 开始使用 桥接 KingFisher, 利用 KingfisherCompatibl ...
- [CSP-S模拟测试]:Cicada与排序(概率DP)
题目传送门(内部题93) 输入格式 第一行一个整数$n$,代表数列的长度. 接下来一行$n$个数$a_i$,用空格分隔开. 输出格式 输出一行$n$个数,表示原数列上这个位置在执行后的期望位置,注意输 ...
- Bootstrap Table--onEditableSave
当某列编辑完成后,需要对当前列所在的行进行修改操作: $("#grid").bootstrapTable({ url:'', …… …… //其他属性 columns:[{ fie ...
- git回滚操作
一,找到之前的版本历史纪录,确定要回滚到那个版本号:git log 二,回滚到这个版本:git reset --hard 72229f823c8b21cbe52142a944d74f1883fa41a ...
- 5、Shiro之jdbcRealm认证授权
登录认证: 注意,下面我是以连接orcal数据库为例的依赖,如果各位同仁使用的是骑她数据库,可以换成对应数据库的依赖(数据源不用换) Pom.xml增加依赖: <!--引入连接orcal的jar ...
- pwa 总结
概述 前几天了解并按照官方文档,成功实现了一个小型的 pwa demo,现在把总结记录下来,供以后开发时参考,相信对其他人也有用. pwa pwa 包括很多内容,我这里只介绍一部分,因为比如 Push ...
- Linux_Rsync远程同步备份服务器
目录 目录 Remote Sync 同步的类型 本地模式 远程模式 RSync列表模式 RSync 服务模式 Setup RSync service How to use the rsync comm ...
- 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_8 Mybatis中的返回值深入-调整实体类属性解决增和改方法的报错
如果实体类和数据库表内的字段没有保持一致 修改了属性子弹. 重新生成getter和setter还有toString方法 测试类里面,相关set的方法就都会报错. 只需要修改为最新的set方法就可以了. ...