首页 新闻 搜索 专区 学院

js的函数属性prototype

0
悬赏园豆:5 [已解决问题] 解决于 2012-12-31 21:24

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是子类,而第二种写法不是吗

axle的主页 axle | 初学一级 | 园豆:185
提问于:2012-09-19 14:50
< >
分享
最佳答案
1

第二种用得是同一个原型定义,如果Ob有扩展也会影响到Oa

收获园豆:2
Ethan轻叹 | 小虾三级 |园豆:996 | 2012-09-21 13:56
其他回答(5)
0

你可以画一下原型链(包括prototype,__proto__,constructor)。

三剑客 | 园豆:92 (初学一级) | 2012-09-19 16:52
0

这个你看一下JavaScript面向对象编程,我记得博客园中有个这样的系列文章,讲的非常透彻,你搜一下

jerry-Tom | 园豆:4077 (老鸟四级) | 2012-09-20 15:43
1

第2中写法,这样导致基类的实例属性,子类访问不到

收获园豆:1
chenping2008 | 园豆:9836 (大侠五级) | 2012-09-22 13:17
0

父类里面的属性访问不到

收获园豆:1
少年学编程 | 园豆:3 (初学一级) | 2012-11-01 12:54
1
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来访问)

收获园豆:1
程序猿小卡 | 园豆:386 (菜鸟二级) | 2012-12-08 10:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册