越来越看不懂js函数了

var a= new function(){
            this.a=1;
            this.b=2;
            this.c=3;
        }
        alert(a.a);//1
        function b(){
            this.a=1;
            this.b=2;
            this.c=3;
        }
        alert(b.a);//undefined
        var c=new b();
        alert(c.a);//1

        var d=function(){
            this.a=1;
            this.b=2;
            this.c=3;
        }
        alert(d.a);//undefined

为啥是这样的呀?

阅读 4.1k
7 个回答

var a= new function(){

        this.a=1;
        this.b=2;
        this.c=3;
    }   // 此处会进行分号插入
    alert(a.a); // a是通过new操作符调用了一个匿名函数表达式,生成的对象,在构造函数中a.a被赋为1
    function b(){
        this.a=1;
        this.b=2;
        this.c=3;
    }
    alert(b.a); // b是一个函数,b这个函数对象没有属性名为a的属性,因此为undefined
    var c=new b();
    alert(c.a); // 通过new操作符调用b构造函数,生成对象c,在构造函数中c.a赋值为1

    var d=function(){
        this.a=1;
        this.b=2;
        this.c=3;
    }
    alert(d.a); // d被赋值为一个匿名函数表达式,该函数没有a属性,返回undefined

直接使用function定义的函数是对象原型,调用它的方法会去寻找prototype上的方法,
而使用new关键字创建的是一个对象实例,在function中使用this.a赋值的是实例属性。
建议去看一下js的原型链

 function b(){
        this.a=1;//实例属性
    }
    b.prototype.name = "hello";//原型属性
    var b1 = new b();
    console.log(b1.a)//1
    console.log(b.name)//hello

这是很基础的构造函数啊,你确定你有去了解过?new 的过程中发生了什么你有了解过?

a就是一个通过new生成的一个对象,所以a.a有值。而bd都是构造函数啊,b和d一个是声明式写法一个是表达式写法,基本上是一样的,只不过d这种写法不能变量提升而已。构造函数需要new去实例化成一个对象,要不然没有对象你怎么取值呢?

大致写一下new的过程
1 先写一个构造函数
function F(name,age){

this.name=name;
this.age=age;

}

F.prototype={

getName:function(){
    return this.name;
}

}

2 实例化一个对象
var a=new F("张三",23);

new的过程分为3步骤
第一步:var a={};//生成一个空对象
第二步:遍历F给a这个对象赋值 //此时a这个对象有了a和b这2个属性,即{name:"张三",age:23};
第三步:a._proto_=F.prototype //将a的原型链指向F这个构造函数的原型对象上去。//此时a这个对象又有了一个方法那就是getName。
最终a这个实例化的对象有了3个属性就是{name:"张三",age:23,getName:function(){return this.name}}

缺乏对于js的构造函数和普通函数的理解啊,建议看下相关的博文,一遍就好,立马了然于胸

new 会创建一个对象,这个对象的属性由构造函数决定
形如

new Foo() //Foo就是构造函数

也就是new后面的东西

var a= new function(){
            this.a=1;
            this.b=2;
            this.c=3;
        }

这里应该是有语法错误的,但是被浏览器忽略了,更符合逻辑的应该是应该是

var a= new function(){
            this.a=1;
            this.b=2;
            this.c=3;
        }()

你可把它看作

var Bar = function(){
    this.a=1;
    this.b=2;
    this.c=3;
}
var a = new Bar()

看下这里,跟你的问题一样
关键在于new,去看下new的执行过程。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题