new 一个对象到底做了什么? 

解决方案 »

  1.   

    申请合适的空间 
    执行对象的初始化方法初始化对象的属性 
    返回申请的空间的地址
     
    0x0000ffff [ | | | | | | | | | | | | |]类似这样
      

  2.   

    function FuckYou(){
    }
    FuckYou.prototype =object_test = {
        name:"John",
    sex:'male',
    getName:function(){
       return this.name;
    }
    }
    var fuckyou = new FuckYou();
    function subFuck(){
         this.sex ='subFemale';
     //FuckYou.call(this);
     subFuck.prototype =fuckyou;
    }
    subFuck.prototype =fuckyou;
    var subObject = new subFuck();
    alert(subObject.getName());
    alert(subFuck.prototype==FuckYou.prototype);
      

  3.   

    既然 alert(subFuck.prototype==FuckYou.prototype); 未false 为什吗还能引用,我就奇了怪了。。
      

  4.   

    subFuck继承了FuckYou的原型对象的方法,getName;
      

  5.   

    prototype也是一个对象,他类似于类的一个属性,==比较的是对象的地址,怎么会相等?
      

  6.   

    new一个对象的过程
    function B(){}
    var a=new B();
    事实上类似于这个过程function B(){}
    var a={};
    a.__proto__=B.prototype;
    B.call(a);
      

  7.   

    function classA(){
        this.s = 54654;
    };
    calssA.prototype.s=444;
    var a = new classA();
    document.write(a.s);
    1.创建Object
    2.查找classA的prototype上的所有方法、属性,复制一份给创建的Object(注意,如果prototype上有属性是function或者数组或者Object,那么只复制指针)
    3.将构造函数classA内部的this指向创建的Object
    4.执行构造函数classA
      

  8.   


    function classA(){
    this.b=1;
    }
    classA.prototype.b=44;
    var b = new classA();
    document.write(b.b + '<--b<br>');
    // 上面是用new做到的
    function newClass(cls,args){
    var obj = {};
    for(var p in cls.prototype)
    obj[p] = cls.prototype[p];
    obj.__proto__ = cls.prototype;
    cls.apply(obj,args||[]);
    return obj;
    };
    var k = newClass(classA);
    document.write(k.b + '<--k<br>');
    // 上面是用函数做到的
      

  9.   

    不是复制。
    而是通过__proto__属性来引用。
    这就是原型链。
    除了IE外,其他浏览器的__proto__属性都是可见的。function B(){}
    var a=new B();
    alert(a.__proto__==B.prototype);如果是复制,上面的代码就不会是true了。
      

  10.   

    您一提醒我想起来了,我忽略了原型链的问题,但是a.__proto__ == B.prototype是否是因为内部实现原理是从__proto__而来,这个不好说。
    我们可以轻松的通过__proto__和构造函数的prototype指向同一对象可以确定,但是各个浏览器实现方式不同,是否是通过__proto__实现不可确定。
      

  11.   

    除了IE,其他浏览器的__proto__可以访问,所以已经可以证明这一点了。
    至于IE,应该也是类似的,只是可能实现方式有稍微的不同。
    鉴于IE在JS方面的落后,可以认为__proto__就是实现原型链的普遍方法。
      

  12.   

    像我的那个函数一样可以实现__proto__,而我内部是复制的prototype的方法却不是__proto__的。
    __proto__可以用来暴露新对象是根据哪个prototype创建而来,但不代表一定是new实现的时候用__proto__作为模板的。
    __proto__的作用是用来给开发者确定它是根据哪个prototype创建而来(好像我在重复..),指向的是对象的构造函数的prototype,仅此而已。
    至于你所谓的浏览器的__proto__可以访问作为证据,显然是站不住脚的。
    我甚至可以自己实现一个__protoABCD__也指向那个prototype,是否证明我内部实现的时候用的__protoABCD__做模板的?
    不可否认的是__proto__指向构造函数的prototype,constructor指向构造函数(貌似我上面实现的那个函数忘记实现constructor了),但是并不代表浏览器内部创造对象的时候是引用__proto__或者constructor作为模板或者构造对象的,尽管他们的指针指向都相同。
      

  13.   

    就是用__proto__实现的。
    因为对于浏览器来说,多写一个方法没有必要。var a={}
    var B=function(){}
    a.__proto__=B.prototype;
    alert(a instanceof B);结果是true
    你写的什么__protoABCD__可不行的。
      

  14.   

    那是因为instanceof比较的是__proto__和constructor.prototype,所以__protoABCD__不行。
    你可以看看我的函数里那个var k那个
    k instanceof classA 也是true的,朋友。
    这又跟浏览器究竟是用prototype作为模板和__proto__作为模板有什么关系?
    我只是说无法确定是用__proto__还是用prototype作为模板的。
    而用prototype作为模板,也可以给对象添加一个__proto__属性,这在c++级别上不过是添加一个指针指向而已。
    话又说回来了,最终结果,prototype与__proto__一定指向同一个对象、同一块内存,您一定要说是用__proto__实现的,这样抬杠有什么意义么?您又不是js内核的实现者怎么就确定它一定是__proto__实现的,没准它起名就叫abcdef回头只是将__proto__指针指向了abcdef指向的对象,这又怎么了?
    我们不是js引擎的实现者,无法确定就是无法确定,您怎么就那么确定?您反编译了还是您实现了?就算您实现了,您实现了您的内核,您实现了IE的js引擎了吗?您实现了chrome的js引擎了吗?您实现了opera引擎了吗?对于各大浏览器来说,保持统一的标准是好的事情,具体内部如何实现的,你我都是推测,所以我说不能确定是为了严谨,我不明白您在这里信誓旦旦就是__proto__有什么意义。