以下是学习中遇到的问题,望大神给个解释,先谢谢啦!首先是clone函数:function clone(object){
    function F(){}
    F.prototype = object;
    return new F();
}其次是:var Person = {
    name : "maoyuanjun",
    getName : function(){
        return this.name;
    }
}
var Author = clone(Person);
Author.books = [];
/*
//这样子声明是错误的
Author.prototype.getBooks = function(){
    return this.books;
}
*/

//这样子声明是正确的呢?
Author.getBooks = function(){
    return this.books;
}

var author = [];
author[0] = clone(Author);
author[0].name = "myj";
author[0].books = ["java"];
author[1] = clone(Author);
author[1].name = "zlp";
author[1].books = ["javascript"];
alert(author[0].getName() + "," + author[0].getBooks());
alert(author[1].getName() + "," + author[1].getBooks());
上面红色的部分,两个不同的情况,为什么有一个是正确的有一个是错误的呢?

解决方案 »

  1.   

    按你clone的写法,是父子关系的指定,而不是内部对象的复制.其实是一种伪克隆(真正的克隆都是后者).
    var Author = clone(Person);
    这等于Person是父类,Author是子类.
    Author.books = [];
    你这样是给子类增加了一个"书库"成员.
    Author.getBooks = function(){
        return this.books;
    }
    这样给子类增加方法,读取子类的书库,自然合适,因为是同一级别.
    Author.prototype.getBooks = function(){
        return this.books;
    }
    而你这样,是给Author的父类Person增加的方法.
    这就好像你给500年前的古人一部手机,可是他却没法用,因为没有手机信号.手机信号在500年后才出现的.
      

  2.   

    /*
    //Author是一个对象的实例,所以他没有prototype这个属性,你错就错在把实例当成构造函数了,你懂的!
    Author.prototype.getBooks = function(){
        return this.books;
    }
    */

    [color=#FF0000]
    Author.getBooks = function(){
        return this.books;
      

  3.   

    不要疑惑了prototype 是什么意思 什么用处 请仔细看明白 看明白了 再玩扩展
      

  4.   

    prototype是Function对象的成员
    Object对象不一定有该成员,所以前一种错误后面那个直接给对象成员赋值,没什么说的,面向对象基础需加强,请先掌握一些js的面向对象基础再理解和使用prototype
      

  5.   


    Author.prototype.getBooks = function(){
        return this.books;
    }prototype是构造函数才有的,对象({})是没有这个属性的,所以会报错。