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设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...
随机推荐
- 在最新的 create-react-app 中添加 less 支持
前置知识: 把 webpack 的相关配置暴露出来 运行 git add -A 运行 git commit -m 'project init' 运行 yarn eject 然后选 y 项目中多出来两个 ...
- 基于AdminLTE的jquery头像更新
最近在写实验室管理系统中的个人信息模块,上边要求实现更改头像功能.百度了一大堆,无实用的.(要么各种币) 本文介绍的只是实现了简单功能(毕竟现在初学阶段) 需要引用文件,顺序也不能错. <scr ...
- 6.Python缩进规则(包含快捷键)
和其它程序设计语言(如 Java.C 语言)采用大括号“{}”分隔代码块不同,Python 采用代码缩进和冒号( : )来区分代码块之间的层次. 在 Python 中,对于类定义.函数定义.流程控制语 ...
- Spring容器的基本使用
1)如何将一个Bean组件交给Spring容器 方法:在applicationContext.xml中添加以下定义 <bean id = “标识符” class = “Bean组件类型”> ...
- Qt数据库之数据库连接池
前面的章节里,我们使用了下面的函数创建和取得数据库连接: void createConnectionByName(const QString &connectionName) { QSql ...
- jQuery.parseJSON()
https://api.jquery.com/jQuery.parseJSON/ https://api.jquery.com/category/deprecated/deprecated-3.0/ ...
- ffmpeg mp4 to wmv and wmv to mp4
//大小=>变小ffmpeg -i 1.mp4 -b:v 2M -vcodec msmpeg4 -acodec wmav2 1_mp4.wmv//大小=>变大ffmpeg -i 1.mp4 ...
- Python基本语法_集合set/frozenset_内建方法详解
目录 目录 前言 软件环境 可变集合Set set函数创建集合 创建空集合 集合元素的唯一性 集合推导式 set类型对象的内置方法 add增加一个元素 remove删除一个元素 pop随机删除并返回一 ...
- Jenkins Html Rport 使用frame报错解决办法
对于Blocked script execution in '<URL>' because the document's frame is sandboxed and the 'allow ...
- centos7安装java JDK
Java环境 1.下载jdk(用FileZilla或xshell工具连接服务器后上传到需要安装的目录) 在 /opt/deploy 下新建 java 文件夹: # mkdir / opt/deploy ...