JavaScript中的构造函数的特点是:没有显示地创建对象、属性和方法直接赋值给了this、没有return。
当我们用new创建构造函数时,会执行如下操作:
- 在内存中创建一个新对象。
- 把新对象内部的Prototype的特性赋值为构造函数的Prototype属性。
- 构造函数内部的this指向这个新对象。
- 执行构造函数内部的代码(给新对象添加属性)。
- 如果构造函数的返回类型是非空对象,则返回该对象;否则返回刚创建的新对象。
第五句啥意思?
让我们来看看源码:
1 | function objectFactory() { |
即如果return的是object或function,则return这个结果,反正就return创建的新对象(this)。
构造函数也是函数,构造函数和普通函数的唯一区别就是调用方式不同。任何函数只要用new调用就是构造函数。而构造函数不使用new调用也是普通函数。那么这时候构造函数内部的this指向谁呢?值得注意的是:再调用一个函数而没有明确设置this值的情况下(即没有作为对象的方法调用,或者没有使用call()/apply()调用),this始终指向gobal对象(在浏览器中就是window对象)。
鉴于函数也是一种对象。如果在构造函数内部定义了函数,那么每一次构造对象的时候都会创建一个明明作用一样,但是是不同对象的方法。比较好的办法是把这个方法写在构造函数外面,再赋值进构造函数里面,比如
1 | function Person(){ |
这样Person()里的sayName就只是一个指向外部的指针。