javascript---繼承
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript---繼承相关的知识,希望对你有一定的参考价值。
ECMASCript关于继承:实现继承----继承了实际方法, 其实现最主要是利用原型链
1. 原型链继承
原型链实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。
1 function superType() { 2 this.protype = true; 3 } 4 5 superType.prototype.getSuperValue = function() { 6 return this.protype; 7 } 8 9 function subType() { 10 this.subProperty = false; 11 } 12 13 subType.prototype = new superType();//继承是superType的实例 14 15 subType.prototype.getSubValue = function() { 16 return this.subProperty; 17 } 18 19 var instance = new subType(); 20 21 console.log(instance.getSuperValue());//true
注意以下几点:
(1)所有自定的对象默认的原型是Object的实例,所有的函数都有一个[[prototype]]指针指向object的原型。
(2)确定原型和实例之间关系方法: instanceof和isPrototypeOf()
(3)给原型添加的方法一定在替换原型之后
(4) 使用对象字面量方法很容易切断原型和继承原型之间的联系
原型继承问题:
a. 原型中包含引用类型值,将继承原型中存在
b. 不能向超类的构造函数中传递参数
2. 借用构造函数(伪造函数和经典继承)
目的:解决原型继承的包含引用类型问题
1 function superType() { 2 this.colors = [‘a", ‘b‘]; 3 } 4 5 function subType() {
//继承SupeType 6 superType.call(this); //这样定义之后,subType的实例都一份color的实例 7 } 8 9 var instance = new subType(); 10 11 instance.colors.push("c"); 12 console.log(instance.colors);// ‘a‘, ‘b‘, ‘c‘ 13 14 var instance1 = new subType(); 15 console.log(instance1.colors); ‘a‘, ‘b‘
利用借用构造继承最大的优势是子类可以给超类传递参数, 最大缺点是方法无法继承
3. 组合继承---原型链和借用构造函数继承组合
组合继承是javascript中最常用的继承方式
1 function superType(name) {pe 2 this.name = name; 3 this.color = [‘green, ‘yellow‘‘;] 4 } 5 6 superType.prototype.sayName = function() { 7 alert(this.name); 8 } 9 10 fucntion subType(name, age){ 11 superType.call(this, name);//借用构造函数 12 this.age = age; 13 } 14 15 subType.prototype = new superType(); 16 subType.prototype.constructor = subType; 17 subType.prototype.sayAge = function() { 18 alert(this.age); 19 }; 20 21 var instance = new subType(‘frank‘, 29); 22 instance.sayName();//‘frank‘ 23 instance.color.push[‘red‘]; //‘red‘, ‘green‘, ‘yellow‘
24 alert(instance.color);
25
26 var instance1 = new subType(‘jack‘, 24);
27 instance1.sayAge(); //24
28 alert(instance1.color);//‘green‘, ‘yellow‘
4. 原型式继承
原理如下函数:
1 function object(o) { 2 function F() {}; 3 F.prototype = o; 4 return new F(); 5 }
ECMAScript通过新增Object.create()函数实现了上述的方法,该函数接受两个函数,一个是作为新对象原型的对象和一个可选为新对象添加的新的属性。
原型式继承用途是在没有必要定义一个构造函数的情况下,只是为了一个对象继承另一个对象的属性和方法。但是该方法对象中包含引用类型时,所有对象实例都会共享。
5. 寄生式继承
6. 寄生组合式继承