在内置类的原型上扩展我们的方法(链式写法)
|
|
- [ ] 2、myNume
123
(5).push(10).reduce(2) 5+10-2Number.prototype.plus=function(num){}Number.prototype.plus=function(num){}
批量设置公有属性
|
|
[x] 1、起别用
(jQuery用)123456function fn(){}var pro=fn.prototype;pro.getX=function(){};pro.getY=function(){};pro.getZ=function(){};[x] 2、重构原型对象的方式
概念
- [ ] 自定义类增加公有属性
图形26
|
|
- [ ] 内置类增加公有属性
浏览器自动屏蔽这种方法修改内置类的属性和方法1234567Array.prototype={constructor:Array;unique:function(){}}console.dir(Array.prototype);//本身内置类的属性方法未被修改
但是一个个修改内置的方法,如果方法名和原来内置重复,则会修改(再内置类的原型上增加方法,命名需要特殊的前缀)
继承前情提要(小技巧)
[x]
技巧一
用for in遍历私有属性[ ] for in默认遍历私有的和自己扩展的属性和方法
|
|
- [ ] 如果只需要遍历私有的,可以加一下两种判断
|
|
- [x]
技巧二
Object.create(obj)方法创建一个新的对象,把obj作为对象的原型。Object.create(原型
,[一组属性和值]
)
作用:多建立一层原型,修改各自的层,不互相受影响
IE6~8不兼容
原型继承(指向)(父类的私有+公有–>子类公有)
- [x]
1、
Fn.prototype=obj; - [ ] 怎么实现原型继承(怎么让Fn的实例f继承obj)
–>将为Fn.prototype重新指向新堆内存obj(Fn.prototype=obj;)
|
|
易错点: Fn.prototype=obj;var f=new Fn;的顺序不能颠倒
- [ ] 怎么解决因为Fn.prototype重新指向新堆内存obj后使得原有的Fn的原型被销毁的问题,Fn的实例找不到Fn原有的原型的constructor了,只能往上找到obj的原型的constructor,结果指向了Object(){}
—>在obj中强行添加constructor:Fn;·
|
|
- [ ] Fn.prototype和obj互影响的问题
–>只克隆,不引用地址
方法一:
|
|
[x]
2、
Object.create(obj)
方法二:使用技巧二的Object.create(obj)方法;123456789101112function Fn(){};var obj={add:function(){}};//obj2是把obj的私有属性放到obj2的原型上var obj2=Object.create(obj);//obj2的原型指向obj> obj2> __proto__:> add:function(){}> __proto__:Object.prototype分析obj、obj2、Fn、f的关系
1234567891011121314151617181920212223242526272829303132333435363738394041424344function Fn() {};var obj = {getx: function() {}};var obj2 = Object.create(obj);Fn.prototype = obj2;var f = new Fn;//obj添加objaddobj.objadd = function() {};obj.objadd();obj2.objadd();Fn.prototype.objadd();// Fn.objadd();访问不到???f.objadd();//obj2添加obj2add(同 Fn.prototype添加Fnproadd)obj2.obj2add = function() {};// obj.obj2add();访问不到obj2.obj2add();Fn.prototype.obj2add();// Fn.obj2add();访问不到f.obj2add();//Fn添加FnaddFn.Fnadd = function() {};// obj.Fnadd();访问不到// obj2.Fnadd();访问不到// Fn.prototype.Fnadd();访问不到Fn.Fnadd();// f.Fnadd();访问不到//-->Fn添加的函数不是公有属性也没有this(无法指向了这个新对象f,即无法将构造函数的作用域赋给新对象f)
分析图27
模拟Object.create(obj)实现原型继承
12345678910var obj={add:function(){}};function object(o){function Fn(){}Fn.prototype=obj;return new Fn;}var newobj=object(obj);[x]
3、
B.prototype=new A(链接)
原型继承是最常用的一种继承方式
子类B要继承父类A的所有(公私有),只需B.prototype=new A;
特点:父类私有和公有的都继承到子类原型上(子类公有的);
核心:不是克隆父类,而是让A和B增加了原型链的链接,B的实例用A的方法,需要一级级查找
图形28;
|
|
call继承(克隆)(父类的私有–>子类私有)
父类私有的–>子类私有
冒充对象继承(克隆)(父类的私有+公有–>子类私有)
父类私有的公有的–>子类私有的
|
|
混合模式继承(原型继承+call继承)(常用)
( 父类的私有–>子类私有的)
(父类的私有–>子类公有的)
(父类的公有–>子类公有的)
寄生组合继承
为解决混合模式继承多复制的那一次(父类的私有–>子类公有的)
中间类继承法
…………