猿问

一道前端面试题

    function Person(){

        getAge = function(){

            console.log(10);

        }

        return this;

    }


    Person.getAge = function(){

        console.log(20);

    }


    Person.prototype.getAge = function(){

        console.log(30);

    }


    var getAge = function(){

        console.log(40);

    }


    function getAge(){

        console.log(50);

    }


    Person.getAge(); // 20 Person的静态方法

    getAge(); // 40 函数的预处理 函数表达式 覆盖了 函数声明


    Person().getAge();

    getAge();


    new Person.getAge();

    new Person().getAge();

    

以下是不太懂的地方,不知道自己的理解是否正确。

    Person().getAge(); // 10  普通的函数调用?
    getAge(); // 不懂为什么输出10

    new Person.getAge(); // 也是Person的静态方法调用?
    new Person().getAge(); // 30
    // new Person()返回一个Person实例, 沿着原型链寻找, 打印30?
    // Person里本身就有getAge()方法,为什么还会去原型链上寻找?


江户川乱折腾
浏览 930回答 2
2回答

守着星空守着你

Person().getAge(); // 10  普通的函数调用?(对就是普通的函数调用)getAge(); // 不懂为什么输出10(因为上面的函数调用,让全局变量getAge指针发生了变化,指向了新函数)new Person.getAge(); // 也是Person的静态方法调用?(这个是构造函数调用,创建了一个 Person.getAge 的实例)new Person().getAge(); // 30// new Person()返回一个Person实例, 沿着原型链寻找, 打印30?// Person里本身就有getAge()方法,为什么还会去原型链上寻找?(这个是构造函数调用,创建了一个 Person 的实例,而 Person 上面是没有getAge这个方法的,所以从原型链上找。Person中的那个getAge不是它的属性,那是一个全局变量,可以说是window的属性。你可以试一下window.getAge();//10)
随时随地看视频慕课网APP
我要回答