w3ctech

为什么构造函数不能后声明,再调用?

    //
    // 为什么在这里 new A 失败?
    //
    var a = new A();

    function A() {
        this.init();
    }

    A.prototype = {
        constructor: A,
        init: function () {
            alert('正常运行');
        }
    };

    //
    // 在这里 new A 才能成功,函数不是后声明都可以的吗?
    //
    var a = new A();
w3ctech微信

扫码关注w3ctech微信公众号

共收到3条回复

  • 解析之后,这段代码相当于

    var a;
    function A(){}
    
    a = new A();
    
    // 这个时候还没有定义prototype,所以出错了。
    A.prototype = {}
    
    回复此楼
  • A.prototype = {...}

    这个不是声明,而是赋值语句,构造函数先声明没问题,只是在调用this.init() 的时候,A.prototype还没有被赋值,所以init方法不存在。

    不是没有定义prototype,而是没有对prototype赋值,这时候prototype是默认的。

    总的来说,JavaScript的function并不存在“prototype声明”这样的东西,prototype和其他属性一样,都是支持动态赋值的,属性在赋值之前就使用了,当然不存在了

    回复此楼
  • 2L正解

    回复此楼