1、直观上
- 构造函数都应该以 一个大写字母开头:
function Foo(){...}
- 非构造函数则应该以一个小写字母开头:
(本文所说的普通函数就是 非构造函数)
function foo(){...}
2、本质区别
无论是构造函数还是非构造函数,两者并没有实质性的区别;构造函数可以作为普通函数使用,普通函数也可以作为构造函数来用;首字母大小写仅仅是为了在开发中能易于区分他们。
无论什么函数:
- 只要通过 new 操作符来调用,那就是作为构造函数使用,此时this指向new出的实例
- 如果不通过 new 操作符来调用,那就是作为普通函数使用;此时,在非严格模式下this都指向window
function foo(name){
this.name = name;
}
function Foo(name){
this.name = name;
}
//当构造函数用:this都指向实例
console.log(new Foo('bty1')); //Foo {name: "bty1"}
console.log(new foo('bty2')); //foo {name: "bty2"}
//当普通函数用:this都指向window
Foo('bty1');
console.log(window.name); //'bty1'
foo('bty2')
console.log(window.name); //'bty2'
从原型链角度看,它们还是没啥区别:
console.log(foo.__proto__ === Function.prototype); //true
console.log(Foo.__proto__ === Function.prototype); //true