日期:2014-05-16  浏览次数:20331 次

关于javascript继承的疑惑
以下是学习中遇到的问题,望大神给个解释,先谢谢啦!

首先是clone函数:
JScript code

function clone(object){
    function F(){}
    F.prototype = object;
    return new F();
}


其次是:
JScript code

var Person = {
    name : "maoyuanjun",
    getName : function(){
        return this.name;
    }
}
var Author = clone(Person);
Author.books = [];
/*
[color=#FF0000]//这样子声明是错误的
Author.prototype.getBooks = function(){
    return this.books;
}
*/[/color]
[color=#FF0000]//这样子声明是正确的呢?
Author.getBooks = function(){
    return this.books;
}[/color]
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());



上面红色的部分,两个不同的情况,为什么有一个是正确的有一个是错误的呢?

------解决方案--------------------
按你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年后才出现的.

------解决方案--------------------
或者你可以理解成变量在不同函数级别的可见性.
函数内部的方法函数,可以见到和访问外部的变量.而内部的变量在外部无法访问.
不同级别的函数之间,和对象的继承级别之间,关系差不多.
------解决方案--------------------
不要疑惑了

prototype 是什么意思 什么用处 请仔细看明白 

看明白了 再玩扩展
------解决方案--------------------
prototype是Function对象的成员
Object对象不一定有该成员,所以前一种错误

后面那个直接给对象成员赋值,没什么说的,面向对象基础需加强,请先掌握一些js的面向对象基础再理解和使用prototype
------解决方案--------------------
JScript code

Author.prototype.getBooks = function(){
    return this.books;
}