首页 新闻 会员 周边

js的一些问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-11-02 13:37

js的原型式继承问题:

function object(o) {

  function F(){}

  F.prototype = o;

  return new F();

}

这段代码中F.prototype = o 进行了浅复制,为什么呢?o是对象,传递的是引用,不是应该没有复制才对么?

lqzerogg的主页 lqzerogg | 初学一级 | 园豆:90
提问于:2012-11-01 17:01
< >
分享
最佳答案
0
function Person(age,name) {
    this.age = age;
    this.name = name;
    this.dance = function () {
        console.log("i'm " + this.name + " at my " + this.age);
    };
}
var jim = new Person(18, "James Green");
function Driver() {
}
Driver.prototype = jim;
var kate = new Driver();

//创建了kate的实例成员name,所以之后的kate.name都是变了
kate.name = "Katherin Green";

//调用kate的dance时候,发现没有定义的实例方法,转而寻找原型方法,
//而此时里面的name是实例的,age还是原来的原型
kate.dance();//i'm Katherin Green at my 18
jim.dance();//i'm James Green at my 18

//看到了吧,没有复制吧?
jim.age = 19;
kate.dance();  //i'm Katherin Green at my 19 
jim.dance();   //i'm James Green at my 19 

kate.age=21;
kate.dance();   //i'm Katherin Green at my 21 
jim.dance();    //i'm James Green at my 19

delete kate.age;
kate.dance(); //i'm Katherin Green at my 19 

//总结:
//实际上是没有对象的复制的,只是让你有办法可以有通过原型方法访问到jim成员的途径而已
//而最终的若是有kate本身的实例成员(name)出现的话,原型(name)会被隐藏,当实例成员的name被删除时候,原型就又会出现了
收获园豆:10
Ethan轻叹 | 小虾三级 |园豆:996 | 2012-11-02 00:17

哥们,给力!

lqzerogg | 园豆:90 (初学一级) | 2012-11-02 13:37
其他回答(2)
0

其实这样返回的对象就可以有了o中所有的属性(不管是实例的还是原型上的)

chenping2008 | 园豆:9836 (大侠五级) | 2012-11-01 17:10

我想问的是为什么会进行了浅复制了···就是说F.prototype指向的对象和o指向的对象为什么不同了?

支持(0) 反对(0) lqzerogg | 园豆:90 (初学一级) | 2012-11-01 19:47
0

原型链的问题啦,其实就是相当于F继承了O,F就有了O中的所有方法与属性。你可以读读大叔的博客,我最近在读... http://www.cnblogs.com/TomXu/archive/2012/01/05/2305453.html

jingjunfeng | 园豆:873 (小虾三级) | 2012-11-01 17:23

没解决我这个问题呀。我想问的是为什么会进行了浅复制了···

支持(0) 反对(0) lqzerogg | 园豆:90 (初学一级) | 2012-11-01 19:46

@lqzerogg: 这个根本就不是什么浅复制什么的,这样的写法是原型链的继承。

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-11-01 22:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册