解决方案 »

  1.   

    你自己都说了person不是对象了new完了才是对象
      

  2.   

    我的意思是说person是一个对象 我搞错了吗
      

  3.   

    function person(){}这是一个函数
    new person()这是个对象
      

  4.   

    javascript所有函数都属于对象下面的。
    对象有:Object、Function、String、Boolean 、Array、Number、Math、Date、Error、activeXObject对象等等
    每一个对象都有一个原型属性或者说是原型对象prototype和一个构造函数(和对象名相同的函数)
    你截图那个说的是这个!
      

  5.   

    首先,纠正一下,你的代码弹出来的是person其实,回答你的问题,person中的this指向的是通过new person()出来的新对象,不是person本身。
    student.call(person)之后,student函数中的this指向person这个函数本身,所以弹出来的是这个函数名。
      

  6.   

    哦。。在IE里弹出来的是undefined。。FF跟chrome弹出来的不是。。其实理论上应该是undefined
      

  7.   

    person 大神这个怎么理解的 我搞糊土了
    person是一个构造函数,js是函数也是对象,但是函数对象本身 和 用这个函数构造出的实例对象是不同的
    看下面function person(){
    this.name = "我是new出来的实例对象";
    }
    person.name = "我是构造函数本身";function student(){
    alert(this.name);
    }
    student.call(person);
    student.call(new person);
      

  8.   

    我觉得LZ还是先简单的理解吧。你的代码第九行student.call(person);多写点应该是window.student.call(person)(如果说的不对欢迎各位高手吐槽)。
    那么那个apply和call用法几乎相同不同的是apply第二个参数只能是数组而call可以是任意参数(他们第一个参数都必须是对象)。
    里面那个person单独的来说是属于js大类型对象当中的Function对象(person instanceof Function //返回值是true)正如9楼所说
    person是一个构造函数,js是函数也是对象,但是函数对象本身 和 用这个函数构造出的实例对象是不同的
    至于为什么IE下是undefined而FF和chrome下是person即为函数的名字那没什么好说的了就是内核不同对象的解释稍微有点不同。
    但是我认为那个this.name更应该是自定义属性不应该是构造函数当中一个指向函数名字的属性(因为指向函数名字有
    person.arguments.callee蓝色字迹部分纯属个人愚见)。
    那么好如果说把第九行改成window.student.call(new person());这就好理解了直接从call函数概念理解就行了。
    应用当前对象(window)一个方法(student)用另外一个对象(new person())替换当前对象(window)
    最终整理下来就是
    function person(){           
     this.name = "123";       
    alert(this.name);
     }
    显而易见弹出应该是123(因为他将student当中的逻辑运算用到new person()对象当中了就是person函数当中。student当中逻辑运算就一句话alert(this.name))所以LZ输出现象并不奇怪。
    OK扯的太多了我说完了欢迎各位高手批评指正
      

  9.   

        function person(){
            this.name = "123";
        }
        alert(person.name);//意思是返回函数名,所以是"person"
        var  a = new person();//new出一个对象
        console.log(a.toSource());//({name:"123"})
        alert(a.name);//当然就是"123"
      

  10.   


    FF跟chrome中的Function对象本身自带name属性,其值就是函数名。并且是只读的。