继承原理:实例中包含一个指向原型对象的内部指针segmentfault
实现方法:让原型对象等于另外一个类型的实例函数
关键点:this
构造函数、原型对象、实例prototype
实例属性、原型方法指针
构造关系、原型关系code
自有属性、继承属性和方法对象
demo:继承
//构造器 function Animal() { this.animal = 'animal'; }; function Mammal() { this.mammal = 'mammal'; }; var cat; //原型链 Mammal.prototype = new Animal(); cat = new Mammal(); //添加属性和方法 Animal.prototype.isAnimal = true; Animal.prototype.sayAnimal = function() { alert('Is it ' + this.animal + '? ' + this.isAnimal); }; Mammal.prototype.isMammal = true; Mammal.prototype.sayMammal = function() { alert('Is it a ' + this.mammal + '? ' + this.isMammal); };
先来看看每一个对象都能访问到哪些属性和方法:原型链
Animal.prototype
:作用域
isAnimal //自定义 sayAnimal() //自定义
Mammal.prototype
:
isMammal //自定义 sayMammal() //自定义 animal //来自构造函数 isAnimal //来自继承 sayAnimal() //来自继承
cat
:
mammal //来自构造函数 isMammal //来自继承 sayMammal() //来自继承 animal //来自继承 isAnimal //来自继承 sayAnimal() //来自继承
在这个demo中,有两对构造关系和两对继承关系(不考虑Object
)。每个经过构造函数实例化的对象(Mammal.prototype
和cat
)都具备构造函数中的属性,实例和构造函数之间是构造关系;构造过程当中也造成了原型关系:Mammal.prototype
是cat
的原型,Animal.prototype
是Mammal.prototype
的原型,实例经过原型链找到原型中的属性和方法。
自定义和构造函数的属性是自有属性,它们是对象自己的属性。来自继承的属性和方法是对象沿着原型链找到的,它们并非对象自己的属性和方法。
实例继承到的方法的做用域是该实例对象内部的执行环境,能够访问实例能获取到的全部属性。经过this.property
的方式能够获得实例对象可以访问到的全部属性和方法,包括自有属性和继承的属性方法。demo中的实例对象cat
能够访问到在Animal
和Mammal
及其原型中定义的全部属性方法,这正是继承的意义所在。
验证:
console.log(cat.mammal); //mammal console.log(cat.isMammal); //true console.log(cat.sayMammal()); //Is it mammal? true console.log(cat.animal); //animal console.log(cat.isAnimal); //true console.log(cat.sayAnimal()); //Is it animal? true
转载请注明出处:http://www.javashuo.com/article/p-qaktmvpx-ge.html
文章不按期更新完善,若是能对你有一点点启发,我将不胜荣幸。