function a() { this.Age = "20"; this.aa = function () { alert(this.Age); } }
        function b() { this.Name = "Xiao"; this.alertName = function () { alert(this.Name); } }
        b.prototype =new a;
        alert(c.aa());
首先第一问题是为什么这里会弹框两次,第一次为20,第二次为undefined我将代码改为:
   function a() { this.Age = "20"; this.aa = function () { alert(this.Age); } }
        function b() { this.Name = "Xiao"; this.alertName = function () { alert(this.Name); } }
        b.prototype =new a.prototype;
        alert(c.aa());
运行没有任何反应, 这是为什么?alert(c.Name);也没有任何反应,但是代码提示器会提示有Name这个属性
问题:
 b.prototype指的是什么?它跟b有什么关系?
b.prototype =new a; 对b有什么影响?
b.prototype.constructor指的是什么?
b.constructor指的是什么?这几天看js的面向对象看得头都晕了,一直没弄明白prototype,求高手解答prototypeconstructorjavascriptJSjs

解决方案 »

  1.   

    首先第一问题是为什么这里会弹框两次,第一次为20,第二次为undefined
    第二次是undefined是因为aa()函数没有返回值,所以undefinedb.prototype指的是什么?它跟b有什么关系?
    b.prototype一般用来给b的实例添加成员函数,属性也可以,但是引用型的就不建议用prototype添加。跟b冒似没有什么关系,跟b的实例有关系。b.prototype =new a; 对b有什么影响?
    将实例a上的成员绑定要b的原型链上,这样new 出来的b实例类似继承了a了一样,拥有了a的成员。b.prototype.constructor指的是什么?
    这个一般是在使用了b.prototype = {
      showName:function(){
       //
      }....
    };后b实例的constructor会指向object对象,为了保证constructor的有效性,一般会用b.prototype.constructor = b;来重新指定一个构造函数。b.constructor指的是什么?
    function A(){}
    var b = new A();
    如果是这种情况的话,constructor属性是实例的构造函数,b的构造函数是A,所以b.constructor就是A。
    alert(b.constructor===A);//truefunction b(){
    }
    如果这种情况的话,那么b.constructor就是Function
      

  2.   


    这个哪种属于引用型啊?
    b.prototype =new a,这个不是一个赋值操作吗?之前的原型链上的东西还在吗?
      

  3.   

    1.prototype是Function类的成员,因此所有函数对象拥有该成员
    2.这是赋值操作,原先原型链上的东西理所当然没了,事实上这一句是继承作用,可以让b类拥有a类的成员,不过这种继承方式不推荐
    3,4.constructor指向构造对象的函数,比如var c=new b();那么c.constructor等于b.prototype.constructor等于b;不过该成员可以被修改prototype是js面向对象中的一个基础机制(注意:基础不是说它简单,是说它的重要性,不能理解这个就是还没有理解,呵呵),所以要在理解js面向对象机制的基础上才能真正理解它,反过来同样成立,理解它才能真正掌握js面向对象,
    所以不要着急,先好好打基础,
    至于constructor不用理会它,基本上你不会用到
      

  4.   

    本质地说也很简单:
    js对象模型是集合
    js访问对象成员时,先从对象本身查找成员,若有,则访问该成员
    若无,从其构造函数原型链上查找,若有,则访问该成员,
    若对象及原型链上都无,则为undefined未能理解的话就是基础还未到
      

  5.   

    说实在的,prototype这种进阶技能不自己写框架用不着了解这么快,
    倒是alert(c.aa());这里的错误要先解决了。
    一个是你c在那里定义了?
    二个是c.aa()里没有返回值,你alter做什么
    三是alert(c.aa()) 弹一次,c.aa()里面弹一次。
    你今晚先搞清楚这三条先去睡觉吧。
      

  6.   


    function a() { this.Age = "20"; this.aa = function () { alert(this.Age); } }
            function b() { this.Name = "Xiao"; this.alertName = function () { alert(this.Name); } }
            b.prototype = new a;
            var c = new b;
    为什么c能访问a和b的成员啊
    b的原型链不是已经被修改了吗
      

  7.   


    var c=new b;这句漏掉了。
    c的原型是b.prototype吗?
    c继承的是b的原型链上的东西?
      

  8.   

    简化的new 过程如下JavaScript new fun的执行过程
    更新时间: 2012 年 11 月 22 日 JavaScript new fun的执行过程
    (1)创建一个新的对象,并让this指针指向它;
    (2)将函数的prototype对象的所有成员都赋给这个新对象;
    (3)执行函数体,对这个对象进行初始化操作;
    (4)返回(1)中创建的对象。貌似还有个复杂版的,忘记在那里看见过了。
      

  9.   

    好好看看  <a href="http://javascript.info>javascript.info</a>
      

  10.   

    3楼说的你没看明白啊...  
    prototype是Function类的成员,a,b都是函数,所以会有这两个成员,至于prototype的作用如我在4楼所说.
    c是对象,不是函数,所以没有prototype成员.
    至于c可以访问b的成员,因为c是b类的对象/实例,这个问题说明你面向对象的基本概念都搞不清楚.
    为什么可以能访问a的成员,因为b.prototype=new a();这句类似继承,给b的原型链上添加了a的成员,b的原型链当然是被修改了,但仔细理解我在4楼说的成员访问过程,原型链上的成员与对象自身成员是分离的,构造函数中this.xxx=xxx会把成员添加到对象本身而不是原型链上,对象c构造时b函数给c添加了一些成员,同样根据我4楼描述的过程,c还可以访问b.prototype上的成员,而b.prototype上的成员就是用a函数添加的,所以c能访问b,a中的成员
    感觉你还是不要急着学js面向对象了,先补一补通用的面向对象知识,类与类的实例,类的构造函数...
      

  11.   

    function a(){}
     a为Function.prototype的对象,a.protoype为a的原型,当创建一个a的对象时,a的对象会通过a的构造函数复制a的内部成员;
    a.prototype为a对象的公共区域,a的所有对象都可以访问;
    b.prototype=new a; 是将b的原型链上存放一个a的对象,所以b的对象也能够访问a的原型链上的东西;
    b的对象在访问一个属性时先从自身内部找起,然后再从b.prototype、a.prototype、Function.prototype最后到Object.prototype,没有就返回undefined是不是可以这样理解?