一、对象冒充

其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式)。因为构造函数只是一个函数,所以可使 Parent 构造函数
成为 Children 的方法,然后调用它。Children 就会收到 Parent 的构造函数中定义的属性和方法。例如,用下面的方式定义 Parent 和 Children:

]// 父类构造函数
var Parent = function(name){this.name = name;this.sayHi = function(){console.log("Hi! " + this.name + ".");}
};// 子类构造函数
var Children = function(name){this.method = Parent;this.method(name); // 实现继承的关键delete this.method;this.getName = function(){console.log(this.name);}
};var p = new Parent("john");
var c = new Children("joe");p.sayHi(); // 输出: Hi! john.
c.sayHi(); // 输出: Hi! joe.
c.getName(); // 输出: jo

原理:就是把 Parent 构造函数放到 Children 构造函数里面执行一次。那为什么不直接执行,非要转个弯把 Parent 赋值给 Children 的 method 属性再执行呢?
这跟 this 的指向有关,在函数内 this 是指向 window 的。当将 Parent 赋值给 Children 的 method 时, this 就指向了 Children 类的实例。

二、原型链继承

众所周知,JavaScript 是一门基于原型的语言,在 JavaScript 中 prototype 对象的任何属性和方法都被传递给那个类的所有实例。原型链利用这种功能来实现继承机制:

// 父类构造函数
var Parent = function(){this.name = "john";this.sayHi = function(){console.log("Hi! " + this.name + ".");}
};// 子类构造函数
var Children = function(){};Children.prototype = new Parent(); // 实现继承的关键var p = new Parent();
var c = new Children();p.sayHi(); // 输出: Hi! john.
c.sayHi(); // 输出: Hi! john.

注意:调用 Parent 的构造函数,没有给它传递参数。这在原型链中是标准做法。要确保构造函数没有任何参数。

三、使用 call 或 applay 方法

这个方法是与对象冒充方法最相似的方法,因为它也是通过改变了 this 的指向而实现继承:

// 父类构造函数
var Parent = function(name){this.name = name;this.sayHi = www.2636666.cn  function(){console.log("Hi! " + this.name + ".");}
};// 子类构造函数
var Children = function(name){Parent.call(this, name); // 实现继承的关键this.getName = function(){console.log(this.name);}
};var p = new Parent(dasheng178.com"john");
var c = new Children("joe");p.sayHi(); // 输出: Hi! john.
c.sayHi(); www.boshenyl.cn// 输出: Hi! john.
c.getName(); // 输出: joe

apply 方法本人就不举列了,它和 call 方法的区别在于它的第二个参数必须是数组。

四、混合方式

对象冒充的主要问题是必须使用构造函数方式,这不是最好的选择。不过如果使用原型链,就无法使用带参数的构造函数了。如何选择呢?答案很简单,两者都用。
在 JavaScript 中创建类的最好方式是用构造函数定义属性,用原型定义方法。这种方式同样适用于继承机制:

// 父类构造函数
var Parent = function(name){this.name = name;
};Parent.prototype.sayHi = function(){console.log("Hi! " + this.name + ".");
};// 子类构造函数
var Children = function(name, age){Parent.call(this, name);www.mhylpt.com/ // 实现继承的关键this.age = age;
};Children.prototype = new Parent(); // 实现继承的关键Children.prototype.getAge = function(){console.log(this.age);
};var p = new Parent("john");
var c = new Children("joe",30);p.sayHi(); // 输出: Hi! john.
c.sayHi(); // 输出: Hi! joe.
c.getAge(); // 输出: 30

五、使用Object.create 方法

Object.create 方法会使用指定的原型对象及其属性去创建一个新的对象:

// 父类构造函数
var Parent = function(name){this.name = name;
};Parent.prototype.sayHi = function(){console.log("Hi! " + this.name + ".");
};// 子类构造函数
var Children = function(name, age){Parent.call(this, name); // 实现继承的关键this.age = age;
};Children.prototype = Object.create(Parent.prototype); // 实现继承的关键
Children.prototype.constructor = children; // @Children.prototype.getAge =www.douniu178.com function(){console.log(this.age);
};var p = new Parent("john");
var c = new Children("joe",30);p.sayHi(); // 输出: Hi! john.
c.sayHi(); // 输出: Hi! joe.
c.getAge(); // 输出: 30

@ 当执行 Children.prototype = Object.create(Parent.prototype) 这个语句后,Children 的 constructor 就被改变为 Parent ,因此需要将 Children.prototype.constructor 重
新指定为 Children 自身。

六、extends 关键字实现继承

这个是 ES6 的语法糖,下面看下es6实现继承的方法:

class Parent {constructor(name, age) {this.name = name;this.age = age;}
}class Children extends Parent {constructor(name, age, job) {this.job = job; // 这里会报错super(name, age);this.job = job; // 正确}
}

上面代码中,子类的constructor方法没有调用super之前,就使用this关键字,结果报错,而放在super方法之后就是正确的。子类Children的构造函数之中的super(),代表调用父类Parent的构造函数。这是必须的,否则 JavaScript 引擎会报错。

注意,super虽然代表了父类Parent的构造函数,但是返回的是子类Children的实例,即super内部的this指的是Children,因此super()在这里相当于Parent.prototype.constructor.call(this)

转载于:https://www.cnblogs.com/qwangxiao/p/8728115.html

harbor1.4.0高可用部署相关推荐

  1. Windows Admin Center 高可用部署

    本文老王将为大家实作Windows Admin Center的高可用部署,相信有了高可用的架构支持将更进一步推进该产品的落地 环境介绍 08dc2 lan 10.0.0.2 255.0.0.0 16s ...

  2. Mysql+Heartbeat+Drbd生产环境高可用部署若干问题解惑

    Mysql+Heartbeat+Drbd生产环境高可用部署若干问题解惑: ############################################################ # ...

  3. Hadoop2.0高可用集群搭建【保姆级教程】

    搭载Hadoop2.0高可用集群 说明 准备 下载好所需要的文件 目录准备 虚拟机网络配置(可能会在其他文章中讲到) 文件的安装 配置环境变量 环境变量的验证 关闭防火墙 配置Hadoop高可用集群 ...

  4. rancher2.6.2 单机及高可用部署

    rancher2.6.2 单机及高可用部署 文章目录 rancher2.6.2 单机及高可用部署 前言 单机部署 高可用部署 k8s集成 前言 1.服务器准备 单机部署: 机器名 IP地址 部署内容 ...

  5. openstack Cinder 架构分析、高可用部署与核心功能解析

    目录 文章目录 目录 Cinder Cinder 的软件架构 cinder-api cinder-scheduler cinder-volume Driver 框架 Plugin 框架 cinder- ...

  6. Skywalking8.5.0-ES7 Rancher部署及ES高可用部署过程记录

    背景 近期本司内部需要用到Skywalking进行链路追踪和日志收集,故记录下部署过程,方便后期学习与查询. ElasticSearch高可用部署 ## 1.docker启动elasticsearch ...

  7. Sentry 高可用部署

    Sentry 高可用部署,部署分析基于Sentry 10.1.0.dev 05e720a7 对应dockerhub镜像版本分别为: getsentry/snuba:31c967e774759c0548 ...

  8. Pod在多可用区worker节点上的高可用部署

    一.      需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS,这种部署方式的目的是可以让一个应用的多个pod(至少两个)能够分布在不同的可用区,起码不能分布 ...

  9. LYNC2013部署系列PART10:后端高可用部署

    前言:本篇文章介绍lync后端服务器高可用的部署,后端服务器的作用就不介绍了,系列第2篇文章中有介绍,目前已部署好了2台SQL服务器,分别为lync2013be.contoso.com和lync201 ...

  10. 腾讯数据库RTOlt;30s,RPO=0高可用方案首次全景揭秘

    为帮助开发者更好地了解和学习分布式数据库技术,2020年3月,腾讯云数据库.云加社区联合腾讯TEG数据库工作组特推出为期3个月的国产数据库专题线上技术沙龙<你想了解的国产数据库秘密,都在这!&g ...

最新文章

  1. 32位oracle_Oracle 之Hugepage
  2. app打开本系统自动登陆设计
  3. 缺少物联网杀手级应用的运营商,到底该怎么办?
  4. 微软2019暑期实习笔试题
  5. 360急速浏览器JS的调试
  6. mybatis注解开发使用二级缓存
  7. b 计数器位选信号 verilog_Verilog HDL菜鸟学习笔记———三、Verilog常用语法之一...
  8. 证明创建runnable实例和普通类时间一样长
  9. 失效日期 软件测试案例_软件异常测试
  10. OAuth:每次授权暗中保护你的那个“MAN”
  11. ROS推荐链接:UNIX/LINUX专为初学者的教程和命令 http://www.ee.surrey.ac.uk/Teaching/Unix/
  12. Android---- android计量单位--dip、px、sp之间区别与联系pixs =dips * (densityDpi/160). dips=(pixs*160)/d...
  13. springmvc最简单的搭建,初学者必看
  14. SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常
  15. 常用视频格式与视频编解码标准介绍
  16. 使用bootloader进行远程固件升级(32MCU)
  17. 技术经理、架构师、技术总监、VP、CTO,这些岗位都是如何挣出来
  18. python turtle 画蜡笔小新_蜡笔小新有几集?作者到底怎么死的啊?
  19. html+css唯品会的登录页面
  20. 赛尔号对战c语言程序,赛尔号计算解析系列文章(第一期)

热门文章

  1. BigData | 一文带你搞清楚“数据倾斜”
  2. R语言自然语言处理:情感分析
  3. spring boot 整合mybatis + swagger2
  4. Android设计模式(1)----单例模式
  5. C#两路list数组归并去重
  6. React.js及React Native知识及实践
  7. access与sqlserver数据转换
  8. 构建插件式的应用程序框架(四)----服务容器(ZT)
  9. React Native 触摸事件处理详解
  10. spring接口 BeanFactoryAware,动态获取IOC容器里面的对象(多例)