javascript的继承机制并不是明确规定的,而是通过模仿实现的,意味着继承不是由解释程序处理,开发者有权决定最适合的继承方式. 下面我给出几种常用的方法:
1 .对象冒充
原理: 构造函数使用this关键字给所有属性和方法赋值, 因为构造函数只是一个函数,所以可以使ClassA的构造函数成为classB的方法,然后调用它.这样classB就会收到classA的构造函数中定义的属性和方法.例子:
function classA(name)
{
this.name=name;
this.showName=function(){alert(this.name);}
}
function classB(name)
{
this.newMethod = classA;
this.newMethod(name);
}
obj = new classA("hero");
objB = new classB("dby");
obj.showName(); // print hero
objB.showName(); // print dby 说明classB 继承了classA的方法.
对象冒充可以实现多重继承 例如
function classz(){
this.newMethod = classX;
this.newMethod();
delete this.newMethod;
this.newMethod=classY;
this.newMethod():
delete this.newMethod;
}
但是如果classX和classY有相同的属性或者方法,classY具有高优先级.
2.call()方法
call方法使与经典的对象冒充法就相近的方法,它的第一个参数用作this的对象,其他参数都直接传递给函数自身.
function sayName(perfix)
{
alert(perfix+this.name);
}
obj= new Object();
obj.name="hero";
sayName.call(obj,"hello," );
function classA(name)
{
this.name=name;
this.showName=function(){alert(this.name);};
}
function classB(name)
{
classA.call(this,name);
}
objB = new classB("bing");
objB.showName();////说明classB继承classA的showName方法
3.apply()方法
aplly()方法有2个参数,一个用作this对象,一个使传递给函数的参数数组.
function sayName(perfix)
{
alert(perfix+this.name);
}
obj= new Object();
obj.name="hero";
sayName.aplly(obj,new Array("hello,") );
4. 原型链
prototype对象的任何属性和方法都会被传递给对应类的所有实例,原型链就是用这种方式来显现继承.
function classA (){}
classA.prototype.name="hero";
classA.prototype.showName=function(){alert(this.name)}
function classB(){}
classB.prototype=new classA();
objb = new classB()
objb.showName();//print hero 说明b继承了a的方法
这里需要注意 调用classA的构造函数时,没有给它传递参数,这是原型链的标准做法,确保函数的构造函数没有任何参数.
并且 子类的所有属性和方法,必须出现在prototype属性被赋值后,应为在它之前赋的值会被删除.因为对象的prototype属性被替换成了新对象,添加了新方法的原始对象将被销毁.
5 混和方式
就是用冒充方式 定义构造函数属性,用原型法定义对象方法.
function classA(name)
{
this.name=name;
}
classA.prototype.showName=function(){alert(this.name)}
function classB(name)
{
classA.call(this,name);
}
classB.prototype = new classA();
classB.prototype.showName1=function(){alert(this.name+"*****");};
obj = new classB("hero");
obj.showName();
obj.showName1();
在classB的构造函数中通过调用call方法 继承classA中的name属性,用原型链来继承classA的showName方法.
相关推荐
保姆级教程:用海思PQTool搞定ISP图像调试,从参数读取到固件烧录全流程
本文提供海思PQTool的ISP图像调试全流程指南,从参数读取、实时调试到固件烧录,涵盖环境配置、核心功能解析、参数固化及生产部署。通过实战案例和避坑指南,帮助开发者高效提升图像质量,适用于海思开发板的ISP调试与优化。
JS 常见的 6 种继承方式
之前方法一和方法二的问题都得以解决,但是这里又增加了一个新问题:通过注释我们可以看到 Parent3 执行了两次,第一次是改变Child3 的 prototype 的时候,第二次是通过 call 方法调用 Parent3 的时候,那么 Parent3 多构造一次就多进行了一次性能开销。从最后的输出结果中可以看到,person5 通过 clone 的方法,增加了 getFriends 的方法,从而使 person5 这个普通对象在继承过程中又增加了一个方法,这样的继承方式就是寄生式继承。
CTF实战:Flask Session流量解密与内存马路由追踪
本文通过一道CTF实战题目,详细解析了Flask Session流量解密与内存马路由追踪的全过程。文章从破解前端加密密码入手,逐步揭示如何利用泄露的SECRET_KEY解密Session,发现命令执行痕迹,并最终追踪到攻击者植入的内存马路由。内容涵盖Wireshark流量分析、flask-unsign工具使用等实战技巧,为CTF选手和安全研究人员提供了一套完整的Flask应用安全分析思路。
支付--微信公众号支付(JSAPI)
这几天公司微信端项目结束,把微信公众号支付做个整理方便有同样功能需求的同学。先放上一份官方文档 https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=7_1,咱们既然要做支付肯定要先了解人家的规范,多读几遍这个文档能少走不少弯路。微信这边的各种平台纷繁复杂,像:微信公众平台、微信开放平台、微信商户平台等,建议大家先把这些关系搞清楚,
UDS 诊断 - CommunicationControl(通信控制)(0x28)服务 诊断
字节参数名称字节值#1CommunicationControl(通信控制)请求SID0x28#2#3communicationType(通信类型)#4nodeIdentificationNumer(节点标识符)(高位字节)controlType 为 0x04 或 0x05 时,使用该参数#5nodeIdentificationNumer(节点标识符)(低位字节)controlType 为 0x04 或 0x05 时,使用该参数。
Keil调试技巧:3种方法查看Cortex-M4的SCB寄存器(含CPUID内存映射解析)
本文详细介绍了在Keil MDK中查看Cortex-M4内核SCB寄存器的三种实战方法:使用Watch窗口进行符号化观察、通过Memory窗口直接查看物理内存映射,以及利用SFR寄存器浏览器解析位域信息。文章重点解析了CPUID寄存器的内存映射地址(0xE000ED00)及其位域含义,帮助开发者深入理解处理器身份识别与底层调试技巧,提升嵌入式系统调试效率。
微信支付之JSAPI支付开发流程
本文简单介绍微信JSAPI支付在直连模式下的整体开发流程。
从零构建OpenBMC风扇控制:基于phosphor-pid-control的实战配置指南
本文详细介绍了如何从零开始构建OpenBMC风扇控制系统,基于phosphor-pid-control框架实现风扇自动调速。通过解析PID算法配置、传感器定义及控制区域设置,提供工业级散热解决方案,帮助开发者优化服务器能效与可靠性。
微信支付开发(5)--JSAPI支付开发详解
JSAPI是微信网页发起支付,应用场景包括: - 用户进入商家公众号,打开某个主页面,完成支付 - 用户点击朋友圈、聊天窗口等商家页面链接打开商家页面,完成支付 - 用户扫描二维码后在微信浏览器中打开页面后完成支付
ubuntu20.04安装nvidia-docker(解决有 Release 文件。 N: 无法安全地用该源进行更新,所以默认禁用该源错误)
然后想都不要想,nvidia+linux安装的东西,那肯定是不能安装成功的,恶毒的nvidia。按照nvidia官网给出的安装nvidia-docker流程来。在sudo apt-get update出现报错。然后再次update,发现还是会有一些警告类似于。,直接点击网页手动下载,发现下载成功!,注意会有安装先后顺序,安装给的提示就行。最后输入命令发现安装成功。然后替换掉里面的内容。直接不管,直接上命令。
PyTorch 最新安装教程(2021-07-27)
PyTorch 最新安装教程(2021-07-27)前言1. 安装 Anaconda2. 检查显卡,更新驱动3. 创建PyTorch环境4. 配置清华TUNA镜像源5. 安装 PyTorch6. 测试 前言 万事开头难! 这句话又一次被我验证。 记得前不久刚陷入Tensorflow2.0的安装困境,这一次又被PyTorch 搞哭辽。 孩子太难了o(╥﹏╥)o,不过还好最终成功安装,感谢全网资源,感谢大佬们的博客!被我一次一次试了出来。 1. 安装 Anaconda Anaconda 是一个用于科学计算的 P
JS之继承和实现继承的方法
实现继承的方法,原型继承 实例化父类,让它作为子类的原型,从而实现子类可以访问到父类构造函数以及原型上的属性或者方法。 优点是简单易于实现,父类新增的实例与属性子类都能访问到; 缺点是在创建子类型的实例时,没有办法在不影响所有对象实例的情况下给父类传递参数。 构造函数继承 原理是调用父类的构造函数然后改变他的this指向,也就是复制父类的实例属性给子类 这样做的优点是解决了子类构造函数向父类传递参数的问题,可以实现多继承(call或apply多个父类),解决了原型中包含实例引用类型值被所有实例共享的问题;
LPDDR6与LPDDR5 channel/rank/die/bank技术探讨
LPDDR6与LPDDR5 channel/rank/die/bank技术探讨
JS实现继承的几种方法总结
首先定义一个父类: //构造函数 function Animal(name) { this.name = name || 'Animal'; this.sleep = function() { console.log(this.name + '正在睡觉!'); }; } //原型上面的方法: Animal.prototype.eat = function(food) { console...
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
js继承java方法吗_在 JavaScript 中实现 Java 式的类继承
在 JavaScript 中实现 Java 式的类继承由 学院君 创建于6个月前, 最后更新于 6个月前版本号 #1260 views0 likes0 collectsJavaScript 和 Java 等强类型面向对象语言的不同之处在于,JavaScript 中的函数都是以值的形式出现的,方法和字段之间没有太大的区别。如果属性值是函数,那么这个属性就定义了一个方法,否则它就是一个普通的属性或「字...
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
【Javascript】call方法实现JS中类的继承
call方法实现JS中类的继承 转载于:https://www.cnblogs.com/nonkicat/archive/2012/11/09/2762937.html
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
javascript4种方法实现继承
有几种实现继承的方式,以下给予总结. 1.打通原型链 function Person(name,age){ this.name=name; } Person.prototype.sayName=function(){ console.log(this.name); } function Programmer(job){ this.job=job; } Programmer.protot...
【JavaScript】JS实现继承最常用的方法
既然JavaScript是OOP编程,那么就一定有继承这个概念。网络上搜了一下,比较乱,这里我做一下总结。 大体有三种方法: 1、apply/call,不能继承原型; 2、prototype,父类构造函数有参数时就失去了继承的意义,就变成了new一个对象; 3、apply/call和prototype混合使用。 其中,最常用的就是第三种,代码如下: function A() {
JS继承方法和实现原理
1.js中继承实现的方法 实现继承首先需要一个父类,在js中实际上是没有类的概念,在es6中class虽然很像类,但实际上只是es5上语法糖而已 js中实现继承的方法共有七种,分别是: 1)原型链继承 2)借用构造函数继承 3)实例继承(原型式继承) 4)拷贝继承 5)组合式继承 6)寄生组合式继承 7)es6继承 ★原型链继承: 把父类的实例作为子类的原型(利用原型让一个引用类型继承另一个引用类型的属性和方法) 优点:简单易于实现,父类新增的实例与属性子类都能访问到 缺点: ♢ 可以在子类中增加实例属性,
js继承java方法吗_JS实现继承的几种方式
前言JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一。那么如何在JS中实现继承呢?让我们拭目以待。JS继承的实现方式既然要实现继承,那么首先我们得有一个父类,代码如下:// 定义一个动物类function Animal (name) {// 属性this.name = name || 'Animal';// 实例方法this.sleep = function(){console.log(...
js实现继承的方法
js函数的继承方法 构造函数、原型和实例的关系: 构造函数是用来创建对象的函数,其本质也是函数,与普通函数的区别在于构造函数通过 new 操作符来调用 每个构造函数都有一个原型对象(propertype),原型对象都包含一个指向构造函数的指针(constructor),而实例都包含一个指向原型对象的内部指针(__ proto __) 原型链继承 //父类构造函数People function People(name) { //属性 this.name = name //方法
JavaScript实现继承的几种方法
JavaScript实现继承
JS实现继承的方法
继承 就是 类与类之间的关系 基类 父类 子类 创建对象(实例)的几种方式 :字面量 工厂函数 构造函数 原型对象 组合创建 class call继承 function Person(name, age) { this.name = name; this.age = age; this.sayHello = function() { console.lo...
JS实现继承的原理及方法详解
一、理解原型 js创建的每个函数都有一个prototype属性,这个属性指向一个对象。这个对象用来存储通过这个函数所创建的所有实例共有的属性和方法, 这个对象称为所有实例的原型对象。每个原型对象都包含一个constructor属性,它指向prototype属性所在的函数。 二、搜索对象属性的过程 每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例...
极经典的JavaScript框架prototype.js中实现继承的方法
本文非原创 Object.extend = function(destination, source) {for (var property in source) { destination[property] = source[property];}return destination;}Prototype 对Object类进行的扩展主要通过一个静态函数Object
5种JS实现继承的方法
JS实现继承的方式有以下几种: 1.通过构造函数实现继承: function Parent1 () { this.name= '111'; } function Child1 () { Parent1.call(this); this.type='222'; } 通过这种方式,只能继承定义在父类构造函数内的属性与方法,定义在prototype原型对象内的属性与方法则无法继承,因此对...
280



被折叠的 条评论
为什么被折叠?



