<<javascript框架设计>>之prototype及javascript中"类"的概念javascript
为对象的类返回原型的引用。html
1.概念和总结java
在javascript中全部函数均可以做为构造器,全部函数都会有prototype这个特殊的对象属性(便是一个对象又是函数对象的属性),好比:浏览器
var baby=function(){框架
var name="宝宝";//(等同于this.name="宝宝")函数
var age=0;//(等同于this.age=0)this
var getname=function(){return this.name;};//(等同于this.getname=function(){return this.name;})spa
function getage(){return this.age};//(等同于this.getage=function(){return this.age;}) prototype
};设计
baby.prototype={
name1:"宝贝",
getname1:function(){return this.name+'刚出生'}
}
var son=new baby();
son.getname2=function(){return '儿子'};
baby即为构造器,son为实例;
使用new一个构造器(函数)来建立一个实例对象.
var child=new baby();
全部同一个构造器(baby)的实例对象(son,child)都会拥有该函数(baby)的prototype对象的全部成员(属性+方法),经过这种方式实现方法和属性的共享.
在javascript中经过修改prototype对象来区别原生对象(内置对象+Arguments)及其余自定义'类'
在浏览器中,Node类是基于Object修改而来,而Element则基于Node,HTMLElement是基于Element.......
原型方法: 定义在prototype对象内的方法(getname1),为全部实例所共享
原型属性: 定义在prototype对象内的属性(name1),为全部实例所共享
特权方法: 直接定义(包括经过this引用建立,如this.getage)在构造器(函数)内的方法,也便是使用var定义的方法,私有
特权属性: 直接定义(包括经过this引用建立,如this.age)在构造器(函数)内的属性,也便是使用var定义的属性,私有
注意-- 经过this引用建立的特权方法或属性(优先访问)会屏蔽同名原型方法或属性,只要手动删除特权方法或属性就能够访问到原型方法或属性.(已验证)
类方法(类属性) : 在javascript中直接定义在函数上的方法,便是经过函数名引用自定义方法名并声明一个函数的方式实现的,该自定义方法即为类方法.形式: func.method = function(){},类方法不会被实例所访问.
继承的实现 : 若是把函数A的prototype对象置换成函数B的原型(prototype),那么A的原型就获得了B的全部原型方法和原型属性.即便后来在B的prototype上添加的方法或属性,也是会被A的原型继承到.
把一个函数的prototype赋给两个不一样的函数而又能保持这两个函数的prototype对象相对独立的两种办法:
方法一(拷贝继承): 经过for in把父类的原型成员逐一赋给子类的原型
方法二(原型继承): 先把父类的prototype赋给一个函数,而后将这个函数实例做为子类的原型
实例的回溯机制: 访问对象的一个属性时会先找其特权成员,若是存在就返回,不存在就去找原型,再没有就找父类的原型......
constructor :每一个实例都有这个方法,指向其构造器.
对象内部属性[[Prototype]]:保存着实例化的构造器所引用的prototype对象,对外提供了一个__proto__属性来访问它
new操做时,
(1) 建立一个空对象 instance
(2) instance.__proto__ = instanceClass.prototype.
(3) 将构造器函数里的 this = instance
(4) 执行构造器里的代码
(5) 断定是否有返回值,没有则返回undefined, 若是返回值为复合数据类型,直接返回, 不然返回 this
注: js中主要的复合数据类型有object和Array,Array实际上是一种特殊数据类型,对于弱类型的js语言,Array有不少其余语言没有的特性。
js复合型数据,参考自--http://www.cnblogs.com/roooc/archive/2012/09/12/2679041.html