JS继承
来源:互联网 发布:网络舆情监控的重要性 编辑:程序博客网 时间:2024/06/09 19:59
一、原型链
1、构造函数、原型、实例的关系:
(1)每个[构造函数]都有一个[原型对象]
(2)[原型对象]都包含一个指向[构造函数]的指针
(3)每个[实例]包含一个指向[原型对象]的内部指针
---->构造函数原型对象<----(内部指针) ^ | | | 实例
2、默认原型对象:Object
这正是所有自定义类型都会拥有toString( ),ValueOf( )等方法
3、确定原型以及实例的关系
(1)instanceof
测试实例与原型链中出现的构造函数
alert(instance instanceof Object) //true
(2)isPrototypeof( )
只要原型链中出现的原型,都是[实例]的原型
alert(Object.protype.isPrototypeof(instance)); //true
4、原型链的问题:
(1)包含引用类型值的原型
假设父类有一个color数组(引用类型值),而且每个子类也都有一个color数组。问题在于,当子类继承自父类时,相当于每个子类共享父类的color数组,而不是每个子类独自拥有一个color数组的属性。
function superType() { this.color = ["red", "blue"];}function subType() {}subType.prototype = new superType();var ins1 = new subType();ins1.color.push("black");alert(ins1.color); // red, blue, blackvar ins2 = new subType();alert(ins2.color); // red, blue, black
(2)在创建子类时,不能向超类的构造函数传递参数
二 、借用构造函数
目的:解决原型链中出现的问题
思想:在子类构造函数中,调用超类构造函数
function superType() { this.color = ["red", "blue"];}function subType() { superType.call(this);}subType.prototype = new superType();var ins1 = new subType();ins1.color.push("black");alert(ins1.color); // red, blue, blackvar ins2 = new subType();alert(ins2.color); // red, blue
三、组合继承
思想:将原型链和借用构造函数组合在一起
原型链:实现对原型属性和方法的继承
借用构造函数:实现对实例属性的继承
最终目的:每个实例有自己的属性,却也能够使用原型的方法
function superType(name) { this.name = name; this.color = ["red", "blue"];}superType.prototype.sayName = function () { console.log(this.name);}function subType(name, age) { //继承属性 superType.call(this, name); this.age = age;}//继承方法subType.prototype = new superType();subType.prototype.constructor = subType;subType.prototype.sayAge = function () { console.log(this.age);}var ins1 = new subType("Nicholas", 29);ins1.color.push("black");console.log(ins1.color); // red, blue, blackins1.sayName();ins1.sayAge();var ins2 = new subType("Greg", 27);console.log(ins2.color); // red, blueins2.sayName();ins2.sayAge();
四、原型式继承
思想:借助原型,基于原有的对象创建新对象
function object(o) { //临时性构造函数 function F() {} //将传入对象作为构造函数的原型 F.prototype = o; //返回临时类型的一个实例 return new F();}
ES5中:object.create( )规范化了原型式继承
与object( )方法的的行为相同
var person = { name: "Nick", friends: ["she", "he", "it"]};//第一个参数为被继承的原型对象var A = Object.create(person);A.name = "Greg";A.friends.push("Bob");//第二个可选参数是,为新对象设置属性var B = Object.create(person, { name : { value: "Greg" } });console.log(person.friends);console.log(B.name);
五、寄生式继承
思想:创建一个仅用于封装继承过程的函数
//寄生式继承(类似于工厂模式)function create(o) { var clone = Object(o); clone.sayHi = function () { console.log("hi"); }; return clone;}var person = { name: "Nick", friends: ['A', 'B', 'C']}var D = create(person);D.sayHi();
六、寄生组合式继承
组合继承的问题:无论什么情况下,都会调用两次超类构造函数
function superType(name) { this.name = name; this.color = ["red", "blue"];}superType.prototype.sayName = function () { console.log(this.name);}function subType(name, age) { superType.call(this, name); //第二次调用superType this.age = age;}subType.prototype = new superType(); //第一次调用superTypesubType.prototype.constructor = subType;subType.prototype.sayAge = function () { console.log(this.age);}
寄生组合式继承思想:借助构造函数来继承属性,通过原型链的混合模式来继承方法
//寄生组合式继承function inherit(subType, superType) { var prototype = Object (superType.prototype); //创建对象 prototype.constructor = subType; //增强对象 subType.prototype = prototype; //指定对象}function superType (name) { this.name = name; this.colors = ['red', 'blue', 'green'];}superType.prototype.sayName = function() { console.log(this.name);};//通过借用构造函数继承属性function subType(name, age) { superType.call(this, name); this.age = age;}inherit(subType, superType);subType.prototype.sayAge = function() { console.log(this.age);};var A = new superType("Apple");var B = new subType("Bob", 15);B.colors.push("Black");console.log(A.colors); //[ 'red', 'blue', 'green' ] console.log(B.colors); //[ 'red', 'blue', 'green', 'Black' ]A.sayName(); //AppleB.sayName(); //BobB.sayAge(); //15
七、总结: 创建对象的模式
- 工厂模式
- 构造函数模式
- 原型模式
- 原型式模式
- 寄生式模式
- 寄生组合继承
0 0
- JS继承--组合继承
- JS继承-类继承
- Js继承。
- js继承
- js继承
- js 继承
- js继承
- JS 继承
- JS 继承
- js继承
- js继承
- JS继承
- JS继承
- js继承
- JS继承
- JS继承
- js继承
- JS继承
- Spark的Master分析3(Master状态改变机制分析)
- spring自动任务调度
- 数据库进阶之数据库索引
- MyEclipse10.5-10.6-10.7导出war包报错问题
- 设计模式之门面模式
- JS继承
- C#开放和封闭原则
- PAT 1017Stack (30)
- iOS 中引导页的实现
- iPhone中使用NSLocalizedString实现国际化
- win10搭建Android开发环境(Eclipse)
- C#中DataTable中的Compute方法使用收集
- 进阶项目1.3-递归函数.数组最大值
- Android PreferenceActivity源码分析与使用总结