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继承思考的更多相关文章

  1. 浅谈ES5和ES6继承和区别

    最近想在重新学下ES6,所以就把自己学到的,记录下加强下自己的理解 首先先简单的聊下ES5和ES6中的继承 1.在es5中的继承: function parent(a,b){ this a = a; ...

  2. ES5和ES6继承方式区别?

    ES5定义类以函数形式, 以prototype来实现继承 ES6以class形式定义类, 以extend形式继承

  3. ES5和ES6中的继承 图解

    Javascript中的继承一直是个比较麻烦的问题,prototype.constructor.__proto__在构造函数,实例和原型之间有的 复杂的关系,不仔细捋下很难记得牢固.ES6中又新增了c ...

  4. ES5和ES6中对于继承的实现方法

    在ES5继承的实现非常有趣的,由于没有传统面向对象类的概念,Javascript利用原型链的特性来实现继承,这其中有很多的属性指向和需要注意的地方. 原型链的特点和实现已经在之前的一篇整理说过了,就是 ...

  5. JavaScript面向对象轻松入门之继承(demo by ES5、ES6)

    继承是面向对象很重要的一个概念,分为接口继承和实现继承,接口继承即为继承某个对象的方法,实现继承即为继承某个对象的属性.JavvaScript通过原型链来实现接口继承.call()或apply()来实 ...

  6. 详解ES5和ES6的继承

    ES5继承 构造函数.原型和实例的关系:每一个构造函数都有一个原型对象,每一个原型对象都有一个指向构造函数的指针,而每一个实例都包含一个指向原型对象的内部指针, 原型链实现继承 基本思想:利用原型让一 ...

  7. ES5与ES6中的继承

    ES5继承在ES5中没有类的概念,所以一般都是基于原型链继承,具体的继承方法有以下几种: 父类: function Father (name) { this.name = name || 'sam' ...

  8. ES5和ES6中的继承

    看到一篇写的非常好的关于js继承的文章,其中对构造函数.原型.实例之间的关系的描述十分透彻,故转载作者文章以随时学习,并供大家共同进步! ES5 ES5中的继承,看图: function Super( ...

  9. ES5与ES6的继承

    JavaScript本身是一种神马语言: 提到继承,我们常常会联想到C#.java等面向对象的高级语言(当然还有C++),因为存在类的概念使得这些语言在实际的使用中抽象成为一个对象,即面向对象.Jav ...

随机推荐

  1. 数据库中存储日期的字段类型到底应该用varchar还是datetime

    将数据库中存储时间的数据类型改为varchar(),这时最好让这些时间是数据库中自动生成的(一个没有格式的输入也可能会导致输出错误),因为存储类型为varchar(),所以获取到的值也就被认为是一个字 ...

  2. SWT table性能改善 -- 使用VirtualTable

    在SWT程序中使用table展示数据时,如果数据过多,执行起来会比较慢,不过,我们可以借助VirtualTable来解决这一问题. Eclipse官网中关于VirtualTable的说明见:http: ...

  3. docker 知识点汇总

    目录 什么是 Docker Docker 简介 Docker 的特点 如何使用 Docker 镜像的常用操作 容器的常用操作 Docker 命令汇总 手工制作 java 镜像 使用 Dockerfil ...

  4. 青蛙的约会(poj1061+欧几里德)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 94174   Accepted: 17412 Descripti ...

  5. kafka-hadoop-consumer

    写了一个工具,从kafka传输数据到hdfs,采用的api,可以消费指定的kafka topic 或者为了简便可以消费所有的topic中各个partition的数据. 地址:https://githu ...

  6. terminate called after throwing an instance of 'std::bad_alloc'

    这个错误,网上搜索到的资料大多是指向内存不足或者内存碎片问题,如下链接 http://bbs.csdn.net/topics/330000462 http://stackoverflow.com/qu ...

  7. [iOS]圆形进度条及计时功能

    平时用战网安全令的时候很喜欢圆形倒计时的效果,然后简单看了一下Android的圆形进度条,后来又写了一个IOS的.整体界面参照IOS系统的倒计时功能,顺便熟悉了UIPickerView的一些特性的实现 ...

  8. 使用ES6+Vue+webpack+gulp构建新一代Web应用

    1.推荐学习网站:Vue.js中国 2.Demo环境搭建: 2.1环境配置 安装nodejs环境,具体内容可以百度: 新建一个文件夹: mkdir VUE-ES6-WebPack 全局安装gulp: ...

  9. 在Docker Swarm上部署Apache Storm:第1部分

    [编者按]本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群.文章系国内 ITOM 管理平台 OneAPM 编译 ...

  10. HttpWebRequest 禁用系统默认代理

    方法一 将HttpWebRequest对象的Proxy属性设置为null 方法二 配置文件修改 <proxy usesystemdefault="False" />