<script type="text/javascript">
var c1=function(){this.name="xw1";}
var c2=function(){this.name="xw2";}
c2.prototype=new c1();
var o2=new c2();
alert(o2.constructor);//c1
</script>js权威指南上 只是说可以通过c2.prototype.construction=c2;来改回constructor属性
但是我还是弄不明白,c2.prototype=new c1(); 这句到底做了些什么......

解决方案 »

  1.   

    http://apps.hi.baidu.com/share/detail/15482416
      

  2.   

    每个类型都有他的prototype,而每个prototype都是一个Object对象(Function内置对象prototype有点特殊)。
    每个类型的prototype都包含有constructor属性,该属性用于当用该类型生成一个对象时确定用哪个constructor来初始化该对象,有点象面向对象的构造器。
    c2.prototype=new c1();这句话就是改变了c2的prototype,这样就改变了c2类型所指向的constroctor。而通过原型链来获得c1的constroctor。
    至于什么是原型链,其概念不是三言两语讲得清楚。
    建议看下下面的两篇文章,一篇看完看另外一篇,有点复杂。。
    http://www.csser.com/dev/52.html
    http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html
      

  3.   

    简单来说:他做的就是搞一个新的c1来当c2的原型复杂的看这里:这个看完看懂你就成功了 http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html还有这个 http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html
      

  4.   

    var c1=function(){this.name="xw1";}
    var c2=function(){this.name="xw2";}
    c2.prototype=new c1();
    var o2=new c2();
    console.log(o2.hasOwnProperty('constructor'));//false
    console.log(o2.__proto__.hasOwnProperty('constructor'))//o2.__proto__指的是new c1();
    console.log(o2.__proto__.__proto__.hasOwnProperty('constructor'));//true
    alert(o2.constructor);//其实o2.constructor是延其原型链一直找到o2.__proto__.__proto__才找到的,而并非o2对象自身的属性
      

  5.   

    说明:firefox 中firebug下的实验
      

  6.   


    c2.prototype=new c1();//这句话修改了c2原型链中的constructor
    //单纯的function里没有constructor属性,
    //o2.constructor其实是在o2的原型链中找constructor属性,
    //c2.prototype.constructor原本应该是c2的,
    //但是c2.prototype=new c1();这句话修改了c2原型链中的constructor,使其指向了c1
    //所以最后一句alert(o2.constructor);会再c2原型链中找到已经指向c1的constructor
    //当执行c2.prototype.construction=c2的时候,变会使原型链中的constructor重新指向c2
      

  7.   

    修改了c2原型连,constructor是原型对象的属性