es5与es6继承思考
es5与es6继承思考
es6继承
class Father{
constructor(name){
this.name = name;
}
getName(){
console.log(this.name);
}
// 这里是父类的f方法
f(){
console.log('fffffffffffffffffffffff');
}
}
class Son extends Father{
constructor(name,age){
super(name); // HACK: 这里super()要在第一行
this.age = age;
}
getAge(){
console.log(this.age);
}
// 子类的f方法
f(){
console.log('sssssssssssssssssssssss');
}
}
var s1 = new Son('张一',12);
s1.getName();
s1.getAge();
console.log(s1.__proto__); // 为Son,不用修正
s1.f(); // 打印ssssssssssssss
s1.__proto__ = new Father(); // 改变s1的原型指向,改为Father
s1.f(); // 打印ffffffffffffff
console.log(s1.__proto__); // 为Father
__proto__
javascript给对象提供了一个__proto__的隐藏属性,某个对象的__proto__属性默认会指向它的构造器的原型对象.
这个是被实例化后的某个具体的对象才有的属性,是个指向。
prototype
这里prototype是个对象
在es5中可以借助ClassMy.prototype.fn = function(){}来对类进行添加可以被所有子类继承的方法。
我在es6中基本没用到这个属性。
es5继承
function Father(name){
this.name = name;
}
function Son(name,age){
Father.call(this,name);
this.age = age;
}
Father.prototype.getName = function(){
console.log(this.name);
}
// NOTE: 这里注意原型继承要在,实例化s1变量之前,如果要使用原型链上的方法的话
// 子类的原型是父类的一个实例
Son.prototype = new Father;
// NOTE: 修正构造器,这里注意要将Son的构造器指向赋值为Son,否则,打印出来的s1是Father对象
Son.prototype.constructor = Son;
Son.prototype.getAge = function(){
console.log(this.age);
}
var s1 = new Son('李四',22);
console.log(s1); // Son {name:'李四',age:22}
s1.getName(); // 李四
console.log(Son.prototype.constructor); // Son
console.log(s1.constructor); // Son,如果不纠正,则为Father
s1.getAge(); // 22
//HACK:这里通过__proto__这个s1实例的属性找到了Son的prototype,并为其添加了say的方法
s1.__proto__.say = function(){
console.log('hhhhhhhhhhhhhhhhhhhhhhhh');
}
s1.say() // 打印 hhhhhhhhhhhhhhh
// NOTE: __proto__这个属性是具体到某个实例化后的对象才有的属性,指向他所属的类的原型
console.log(new Son().__proto__); // 为Son对象
我一直使用es6的class来进行面向对象的开发,但是有许多的遗留的原始的es3,es5的js代码需要理解,所以写了本文,帮助理清继承问题
es5与es6继承思考的更多相关文章
- 浅谈ES5和ES6继承和区别
最近想在重新学下ES6,所以就把自己学到的,记录下加强下自己的理解 首先先简单的聊下ES5和ES6中的继承 1.在es5中的继承: function parent(a,b){ this a = a; ...
- ES5和ES6继承方式区别?
ES5定义类以函数形式, 以prototype来实现继承 ES6以class形式定义类, 以extend形式继承
- ES5和ES6中的继承 图解
Javascript中的继承一直是个比较麻烦的问题,prototype.constructor.__proto__在构造函数,实例和原型之间有的 复杂的关系,不仔细捋下很难记得牢固.ES6中又新增了c ...
- ES5和ES6中对于继承的实现方法
在ES5继承的实现非常有趣的,由于没有传统面向对象类的概念,Javascript利用原型链的特性来实现继承,这其中有很多的属性指向和需要注意的地方. 原型链的特点和实现已经在之前的一篇整理说过了,就是 ...
- JavaScript面向对象轻松入门之继承(demo by ES5、ES6)
继承是面向对象很重要的一个概念,分为接口继承和实现继承,接口继承即为继承某个对象的方法,实现继承即为继承某个对象的属性.JavvaScript通过原型链来实现接口继承.call()或apply()来实 ...
- 详解ES5和ES6的继承
ES5继承 构造函数.原型和实例的关系:每一个构造函数都有一个原型对象,每一个原型对象都有一个指向构造函数的指针,而每一个实例都包含一个指向原型对象的内部指针, 原型链实现继承 基本思想:利用原型让一 ...
- ES5与ES6中的继承
ES5继承在ES5中没有类的概念,所以一般都是基于原型链继承,具体的继承方法有以下几种: 父类: function Father (name) { this.name = name || 'sam' ...
- ES5和ES6中的继承
看到一篇写的非常好的关于js继承的文章,其中对构造函数.原型.实例之间的关系的描述十分透彻,故转载作者文章以随时学习,并供大家共同进步! ES5 ES5中的继承,看图: function Super( ...
- ES5与ES6的继承
JavaScript本身是一种神马语言: 提到继承,我们常常会联想到C#.java等面向对象的高级语言(当然还有C++),因为存在类的概念使得这些语言在实际的使用中抽象成为一个对象,即面向对象.Jav ...
随机推荐
- PhpStorm快捷方式
转载源:http://www.cr173.com/html/66775_1.html PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,PhpStorm可随时帮助用 ...
- leetcode916
单词子集 我们给出两个单词数组 A 和 B.每个单词都是一串小写字母. 现在,如果 b 中的每个字母都出现在 a 中,包括重复出现的字母,那么称单词 b是单词 a 的子集. 例如,“wrr” 是 “w ...
- 使用 RabbitMQ 实现异步调用
目录 引言 启动 RabbitMQ 服务器 运行 rabbitmq 容器 RabbitMQ 控制台 Exchange 和 Queue 开发服务端和客户端 开发服务端 开发客户端 Java Bean 类 ...
- 2017 年 PHP 程序员未来路在何方
PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js . GO . Python 不断地在挑战 PHP 的地位.这些技术的推 ...
- Java - 数组解析
java提高篇(十八)-----数组之一:认识JAVA数组 一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸 ...
- 【 js 基础 】【读书笔记】关于this
this 关键字是 Javascript 中很特别的一个关键字,被自动定义在所有函数的作用域中.this提供了一种更优雅的方式隐式“传递”一个对象的引用.今天就来说说 this 的指向问题. this ...
- 【代码笔记】iOS-手机系统版本
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...
- 从零开始学习html(十二)CSS布局模型——上
一.css布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了. 布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之 ...
- 实现卡片效果【DIV+CSS3】
一.文字卡片效果 <html> <head> meta<charset="utf-8"> <title>文字卡片效果</tit ...
- [基础架构]PeopleSoft Tuxedo 重要文件说明
我们都知道PeopleSoft是由几个不同的服务组成的,他们在PeopleSoft体系结构中扮演着自己的角色.这些服务具有不同的文件结构并包含重要的可执行文件和配置文件. 以下是Peoplesoft体 ...