面向对象

function Foo() {
    getName = function () {
        console.log(1);
    };
    return this;
}
Foo.getName = function () {
    console.log(2);
};
Foo.prototype.getName = function () {
    console.log(3);
};
var getName = function () {
    console.log(4);
};
function  getName() {
    console.log(5);
}

Foo.getName();        //2
getName();        //4
Foo().getName();        //Foo()普通函数执行;Foo执行过程中,内部函数有个getName赋值,但是getName并不是私有的,于是此时重新定义全局的getName = -> 1,并且返回this,这里的this的指向就是window,那么应该是window.getName  1
getName();        //1
new Foo.getName();    //无参数new,点的方式叫做成员访问。优先级问题,先执行成员访问,new一个输出2的函数,那么输出也是2
new Foo().getName();    //有参数new,执行方式先new Foo,再getName。创建实例,实例的getName,那么应该找prototype上的,因此结果是3
new new Foo().getName();    //优先级new (new Foo()).getName().getName,先new Foo()创建一个实例foo,变成 new foo.getName(),此时变成了先成员访问,原型上的方法,输出3的方法,变成了new 3,即3

注意:由参数的new先执行new,无参数的new和成员访问两个同级别,谁先救先执行谁

答案为:2 4 1 1 2 3 3


//function声明加赋值,var先声明先不赋值
Foo AAAFFF0000
getName = func -> 5

//代码执行

Foo是一个堆,里面存了方法代码字符串,Foo仍然是一个对象,有prototype(也是一个引用类型即也是一个堆)、length、然后我们给他加了一个getName属性;

getName = func -> 4    //之前赋值输出5,之后重新赋值输出4的

变量提升:在var function,所有代码执行之前,带var和function提前定义和赋值

相似题目

function A(){
    alert(1);
}
function Fn() {
    A=function(){
       alert(2);
    };
    return this;
}
Fn.A=A;
Fn.prototype={
    A:()=>{
       alert(3);
    }
};
A();            //1
Fn.A();        //1
Fn().A();    //2
new Fn.A();        //2
new Fn().A();        //2
new new Fn().A();        //报错

//注意最后一个,箭头函数是不可以被new的,因为箭头函数没有原型链,也就没有constructor构造器

results matching ""

    No results matching ""