js的是基于原型链继承的,请问下面的两种情况差别在哪里?
function Oa(){ } Oa.prototype={ fn1:function(){}, fun2:function(){} } function Ob(name,age){ this.name=name; this.age=age; } //第一种写法,类Ob通过new继承了Oa的属性(此处为空)和原型 Ob.prototype=new Oa; //第二种写法,直接把Oa的原型对象赋值给了Ob Ob.prototype=Oa.prototype;
这两种写法,都能够实现Ob的实例共享了Oa原型对象上的方法,差别在于第一种写法可以看作Oa是基类,Ob是子类,而第二种写法不是吗
第二种用得是同一个原型定义,如果Ob有扩展也会影响到Oa
你可以画一下原型链(包括prototype,__proto__,constructor)。
这个你看一下JavaScript面向对象编程,我记得博客园中有个这样的系列文章,讲的非常透彻,你搜一下
第2中写法,这样导致基类的实例属性,子类访问不到
父类里面的属性访问不到
function Oa(){ this.gender = '男'; //注意这里 } Oa.prototype={ fn1:function(){}, fun2:function(){} } function Ob(name,age){ this.name=name; this.age=age; } //第一种写法,类Ob通过new继承了Oa的属性(此处为空)和原型 Ob.prototype=new Oa; //第二种写法,直接把Oa的原型对象赋值给了Ob Ob.prototype=Oa.prototype;
上面加了句代码
1)第一种写法:Ob的prototype是Oa 的一个实例,我们可以简单的把Oa的实例看成如下对象(实际情况并不是这样)
//假设Oa的实例为 instance_a { gender: '男', fn1: function(){}, //Oa原型的方法,可以直接通过instance_a.fn1访问,实际上访问的是Oa.prototype.fn1 fn2: function() }
2)第二种写法,Ob的prototype指向了Oa的prototype,fn1、fn2是Oa的prototype的方法,gender是Oa的实例属性,所以,Ob的实例能够访问到的,只有fn1、fn2
ps:
实例属性(方法)一般形式: this.XXX = YYY; (实例属性只有new 出一个对象后,才可以访问)
原型属性(方法)一般形式:Oa.prototype.XXX = YYY;(原型属性对于new 出的所有对象均可以访问,也可以直接Oa.prototype.XXX来访问)