codelet有这三类形式?
// 面向全国字面上量 var o1={name:01}; var o11=new Object({name:o11}); // 采用表明的缺省: var M=function(){this.name=02}; var o2=new M(); // 透过Object.create()建立 var P={name:o3}; var o3=Object.create(P)嘿嘿 蓝本、内部结构函、示例、蓝本链 间的亲密关系?
1、此基础
缺省能透过new来聚合两个示例、缺省也是表达式;
表达式都有两个prototype特性,那个是蓝本第一类;
蓝本第一类能透过内部结构器constructor来对准它的缺省;
示例的__proto__特性,对准的是其缺省的蓝本第一类;蓝本链
:从两个示例第一类,向上找内部结构那个示例相关联的第一类,相关联的第一类又向上找,找到创造它的两个示例第一类,
一直到Object.prototype截止。原型链是透过prototype和__proto__向上找的。缺省透过prototype建立了很多方法,
被其所有示例所公用,存放在蓝本第一类上;例子:
var M=function(name){this.name=name};var o3=new M(o3);当我们需要扩展示例的时候,我们能对缺省添加方法,但是这样会建立每两个示例都拷贝一份它自己的添加的方法,
占用内存,而且也没有必要,那个时候就能新添加的方法写进蓝本里面去,添加到蓝本链中去,
在示例的蓝本链中我们能在蓝本第一类上找到添加的方法; var M=function(name){this.name=name}; var o3=new M(o3); M.prototype.say=function(){ Console.log(say hi); }; var o5=new M(o5);透过这种形式o3和o5都有say方法;蓝本链的优势是蓝本第一类的方法是被所有示例共有的;
当访问两个示例方法的时候,首先在示例本身找那个方法,如果没有找到就会到其构建表达式的蓝本第一类去找,如果还是没有找到,
那么它会继续透过蓝本链在蓝本第一类的更上一级查找,一直到object.prototype;一定要记住只有表达式才有proptotype,第一类是没有的;
只有示例第一类又__proto__ , 因为表达式也是第一类,所以表达式也有__proto__ , 但是和示例第一类的__proto__是有区别的,表达式的__proto__是function那个第一类的内部结构示例;
2、instanceof 原理
示例第一类上面有两个__proto__ ,那个是引用的它缺省的蓝本第一类;
instanceof是用来判断示例是不是由某个缺省示例化出来的第一类,其原理是判断示例第一类是否对准缺省的蓝本;
只要是在蓝本链上的表达式,都会被instanceof看做是示例第一类的两个缺省,所以都会返回true;m1.__proto__===m1.prototype;返回true m1.prototype.__proto===Object.prototype;返回trueo3.__proto__.constructor===Object;//返回false 所以我们判断两个示例第一类的缺省,用constructor;3、new 运算符
后面跟着的是两个缺省
两个新第一类被建立。它继承自 foo.prototype->
缺省foo会被执行,执行的时候,相应的传参会被传入,同时上下文(this)会被指定为那个新示例。 new foo等同于new foo(),只能在不传递任何参数的情况->
如果缺省返回了两个‘第一类’,那么那个第一类会取代整个new 出来的结果。如果缺省没有返回值, 那么new出来的结果为步骤1建立的第一类4、Object.create()
建立的示例第一类是对准的对象蓝本,示例第一类本身是不具备codelet的特性和方法的,是透过蓝本链来链接的。