js寄生组合式继承
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>寄生组合继承</title>
</head>
<body>
<script>
function inHeritPrototype(Son,Parent) {
var prototype=Object.create(Parent.prototype);
/*
es5语法,最后会返回一个new F()的实例,此实例的__proto__指向Parent.prototype
相当于function create(obj){
function F(){}
F.prototype=obj;
return new F()
}
*/
prototype.constructor=Son;
Son.prototype=prototype;
}
function Parent(name){
this.name=name;
this.colors=["red","black","blue"];
}
Parent.prototype.sayName=function () {
alert(this.name);
}
function Son(name,age) {
Parent.call(this,name);
this.age=age;
}
inHeritPrototype(Son,Parent);
Son.prototype.sayAge=function(){
alert(this.age);
}
var son=new Son('zxf',25);
console.log(Parent.prototype)
console.log(Son.prototype);//此处子类的原型没有继承父类的属性,而是直接继承了父类原型上的属性和方法,
//继承父类属性的语句是Parent.call()这句话实现的,这样就避免了组合式继承的缺点-调用了两个父类的构造函数,导致给子类的原型上添加了父类的实例属性
//最完美的是子类的原型上只继承父类的原型的属性,而不是继承父类实例的属性,通过寄生组合式继承可以实现子类实例之间修改引用类型的属性时互不影响
//因为这句话Parent.call()让每个子类都有个父类属性的一个副本,是一个等于在子类实例上各自创建了属性而不是指向父类的属性,另外
//通过inHeritPrototype方法实现了子类只继承父类原型上的方法和属性,这里实现了属性和方法的共享,可谓完美啊
</script>
</body>
</html>
js寄生组合式继承的更多相关文章
- js组合继承和寄生组合式继承比较
本文是原创文章,如需转载,请注明文章出处 1.js中实现组合继承(B继承A): function A(name){ this.name = name; this.ary = ["AA&quo ...
- 详解js中的寄生组合式继承
寄生组合式继承是js中最理想的继承方式, 最大限度的节省了内存空间. js中的寄生组合式继承要求是: 1.子对象有父对象属性的副本, 且这些不应该保存在子对象的prototype上. 2. ...
- [js高手之路]寄生组合式继承的优势
在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: function Person( uName ){ this.skills = [ 'php', ...
- 寄生组合式继承 js
寄生组合式继承是集寄生式继承和组合继承的优点于一身,是基于类型继承最有效的方式 function object(o){ function F(){}; F.prototype = o; return ...
- JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承
说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象J ...
- javaScript设计模式之面向对象编程(object-oriented programming,OOP)--寄生组合式继承
组合式继承:将类式继承同构造函数继承组合使用,但是存在一个问题,子类不是父类的实例,而子类的原型式父类的实例,所以才有了寄生组合式继承. 意思就是说,寄生就是寄生式继承,寄生式继承就是依托于原型继承, ...
- JavaScript对寄生组合式继承的理解
有关JavaScript的几种继承方式请移步JavaScript的几种继承方式 原型链的缺陷 SubType.prototype = new SuperType(); 这样做的话,SuperType构 ...
- JavaScript寄生组合式继承分析
JavaScript寄生组合式继承特点: 避免了在子类prototype上创建不必要多余的属性,相比直接继承基类的实例效率要高. 是JavaScript 实现继承的最有效方式. <script& ...
- JavaScript高级程序设计之寄生组合式继承
在继承中常会出现两个问题: 父类的属性变成了子类的原型 构造器指向混乱 寄生组合式继承解决了这样的问题: 属性继承到属性 原型继承到原型 构造器指向明确 // 父类 var Super = funct ...
随机推荐
- Wallet file not specified (must request wallet RPC through /wallet/<filename> uri-path). BitcoinJSONRPCClient异常、及其他异常
1.异常信息 Wallet file not specified (must request wallet RPC through /wallet/<filename> uri-path) ...
- 吴裕雄--天生自然 JAVA开发学习:switch case 语句
public class Test { public static void main(String args[]){ //char grade = args[0].charAt(0); char g ...
- MyBatis从入门到精通(第6章):6.3 使用枚举或其他对象
6.3 使用枚举或其他对象 在 sys_role 表中存在一个字段 enabled,这个字段只有两个可选值,0 为禁用,1 为启用.但是在 SysRole 类中,我们使用的是 Integer enab ...
- cin cout
编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行的任何位置.当用户按下enter键,数据输入停止.程序自动对所有的整数进行求和并打印出结果. 需要解决两个 ...
- 嵌入式linux学习笔记
1.溢出:两个数相加,如果最高位的进位和此高位的进位不同,则产生溢出. 2.进位和溢出的概念不一样. 3.预取(取得是编译后得到的机器代码)-->译码-->执行 4.ARM的汇编指令长度是 ...
- Python笔记_第二篇_面向过程_第二部分_5.第三方模块的使用和自定模块(以Pillow模块为例)
1. 安装第三方模块: 打开黑屏终端: cmd: pip -verson pip - V C:\windows\system32>pip -V pip from c:\python37\lib\ ...
- i春秋web作业2.26
Web安全工程师(入门班) [全国线上入门班53期]课后作业 2020-2-26 DorinXL 1)为什么说js校验是一种不安全的校验方式? js校验不安全,是因为用户很容易通过控制台删除或 ...
- 吴裕雄--天生自然 JAVA开发学习:抽象类
public abstract class Employee { private String name; private String address; private int number; pu ...
- vue路由的跳转-路由传参-cookies插件-axios插件-跨域问题-element-ui插件
---恢复内容开始--- 项目初始化 创建一个纯净的vue环境项目,手动书写全局的样式配置,全局的main,js配置 (1)如果vue项目在重构或者出错的时候,手动安装node_modules. 如果 ...
- embed标签属性
embed标签属性 (一).基本语法: embed src=url 说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等, Netscape及新版 ...