《JavaScript高级程序设计 第三版》 学习笔记
Object-Oriented 有一个标志,就是都有类的概念,经过类来建立多个具备相同属性和方法的对象。而对于 EMCAScript中没有类的概念,ECMA-262把对象定义为
”无序属性的集合,该属性能够包含任何基本值,对象或者函数。“函数
每一个函数都有一个prototype(原型)属性学习
这个属性都有一个指针,指向一个对象this
这个对象包含由特定类型全部实例共享的属性和方法spa
使用原型的好处是 可让全部对象实例共享它包含的方法和属性.net
经过in操做符和hasOwnProperty来判断给定属性是来自于原型仍是实例
in- true 表明属性在对象中存在 来自实例或者来自原型
hasOwnProperty- true表明属性来自于实例 是实例属性prototype
ECMAScript中只支持实现继承,并且是经过原型链的方式来实现的设计
理解原型对象
是这样的
当咱们建立一个新函数的时候,会根据一组特定的规则为该函数建立一个prototype
属性,这个prototype
属性指向函数的原型对象。在默认状况下,原型对象都会自动得到一个constructor
(构造函数)属性,这个属性包含包含一个指向prototype属性所在函数的指针。
因此关系就是
好比有一个Person的对象
Person.prototype => 原型对象
原型对象.constructor => Person
即 Person.prototype.constructor == Person
见下图关系指针
将原型链做为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另外一个引用类型的属性和方法。
demo代码code
function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ return this.property; } function SubType(){ this.subproperty = false; } //SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function(){ return this.subproperty; } // 继承SuperType 就指向了SuperType的原型对象了 SubType.prototype = new SuperType(); var instance = new SubType(); alert(instance.getSuperValue()); // true alert(instance.property); //true
<iframe width="100%" height="300" src="http://jsfiddle.net/JimWang/dmkLmnhL/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>对象
若是把SubType中的subproperty改为property会是怎么样呢 都会变成false
demo图解
备注:之因此 SuperType中property属性会出如今,SubType.prototype中,是由于property是一个实例属性,而SubType.prototype是SuperType的一个实例对象,因此property属性会出如今SubType.prototype中,可是这个property相对于instance(SubType的一个实例)却又是一个原型属性,因此若是将subproperty换成property的话,在return this.property时,优先找到实例属性中有这么一个属性,就会返回实例属性。此外这里SubType.prototype.constructor 被重写了,instance.constructor指向了SuperType 看图instance.getSuperValue() 这个搜索的过程1) 搜索实例2) 搜索SubType.prototype3) 搜索SuperType.prototype搜索老是一步步向前到原型链末端中止(Object)