harbor1.4.0高可用部署
一、对象冒充
其原理如下:构造函数使用 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高可用部署相关推荐
- Windows Admin Center 高可用部署
本文老王将为大家实作Windows Admin Center的高可用部署,相信有了高可用的架构支持将更进一步推进该产品的落地 环境介绍 08dc2 lan 10.0.0.2 255.0.0.0 16s ...
- Mysql+Heartbeat+Drbd生产环境高可用部署若干问题解惑
Mysql+Heartbeat+Drbd生产环境高可用部署若干问题解惑: ############################################################ # ...
- Hadoop2.0高可用集群搭建【保姆级教程】
搭载Hadoop2.0高可用集群 说明 准备 下载好所需要的文件 目录准备 虚拟机网络配置(可能会在其他文章中讲到) 文件的安装 配置环境变量 环境变量的验证 关闭防火墙 配置Hadoop高可用集群 ...
- rancher2.6.2 单机及高可用部署
rancher2.6.2 单机及高可用部署 文章目录 rancher2.6.2 单机及高可用部署 前言 单机部署 高可用部署 k8s集成 前言 1.服务器准备 单机部署: 机器名 IP地址 部署内容 ...
- openstack Cinder 架构分析、高可用部署与核心功能解析
目录 文章目录 目录 Cinder Cinder 的软件架构 cinder-api cinder-scheduler cinder-volume Driver 框架 Plugin 框架 cinder- ...
- Skywalking8.5.0-ES7 Rancher部署及ES高可用部署过程记录
背景 近期本司内部需要用到Skywalking进行链路追踪和日志收集,故记录下部署过程,方便后期学习与查询. ElasticSearch高可用部署 ## 1.docker启动elasticsearch ...
- Sentry 高可用部署
Sentry 高可用部署,部署分析基于Sentry 10.1.0.dev 05e720a7 对应dockerhub镜像版本分别为: getsentry/snuba:31c967e774759c0548 ...
- Pod在多可用区worker节点上的高可用部署
一. 需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS,这种部署方式的目的是可以让一个应用的多个pod(至少两个)能够分布在不同的可用区,起码不能分布 ...
- LYNC2013部署系列PART10:后端高可用部署
前言:本篇文章介绍lync后端服务器高可用的部署,后端服务器的作用就不介绍了,系列第2篇文章中有介绍,目前已部署好了2台SQL服务器,分别为lync2013be.contoso.com和lync201 ...
- 腾讯数据库RTOlt;30s,RPO=0高可用方案首次全景揭秘
为帮助开发者更好地了解和学习分布式数据库技术,2020年3月,腾讯云数据库.云加社区联合腾讯TEG数据库工作组特推出为期3个月的国产数据库专题线上技术沙龙<你想了解的国产数据库秘密,都在这!&g ...
最新文章
- 32位oracle_Oracle 之Hugepage
- app打开本系统自动登陆设计
- 缺少物联网杀手级应用的运营商,到底该怎么办?
- 微软2019暑期实习笔试题
- 360急速浏览器JS的调试
- mybatis注解开发使用二级缓存
- b 计数器位选信号 verilog_Verilog HDL菜鸟学习笔记———三、Verilog常用语法之一...
- 证明创建runnable实例和普通类时间一样长
- 失效日期 软件测试案例_软件异常测试
- OAuth:每次授权暗中保护你的那个“MAN”
- ROS推荐链接:UNIX/LINUX专为初学者的教程和命令 http://www.ee.surrey.ac.uk/Teaching/Unix/
- Android---- android计量单位--dip、px、sp之间区别与联系pixs =dips * (densityDpi/160). dips=(pixs*160)/d...
- springmvc最简单的搭建,初学者必看
- SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常
- 常用视频格式与视频编解码标准介绍
- 使用bootloader进行远程固件升级(32MCU)
- 技术经理、架构师、技术总监、VP、CTO,这些岗位都是如何挣出来
- python turtle 画蜡笔小新_蜡笔小新有几集?作者到底怎么死的啊?
- html+css唯品会的登录页面
- 赛尔号对战c语言程序,赛尔号计算解析系列文章(第一期)
热门文章
- BigData | 一文带你搞清楚“数据倾斜”
- R语言自然语言处理:情感分析
- spring boot 整合mybatis + swagger2
- Android设计模式(1)----单例模式
- C#两路list数组归并去重
- React.js及React Native知识及实践
- access与sqlserver数据转换
- 构建插件式的应用程序框架(四)----服务容器(ZT)
- React Native 触摸事件处理详解
- spring接口 BeanFactoryAware,动态获取IOC容器里面的对象(多例)