function Fn(x, y) {
let sum = 10;
this.total = x + y;
this.say = function() {
console.log(`我计算的和是:${ this.total }`);
}
}
let res = Fn(10, 20); // 普通函数执行
let f1 = new Fn(10, 20); // 构造函数执行
let f2 = new Fn;
console.log(f1.sum);
console.log(f1.total);
console.log(f1.say === f2.say);
普通函数执行
let res = Fn(10, 20);
执行过程如下:
构造函数执行
let f1 = new Fn(10, 20);
执行过程如下:
可以看到他们的区别具体如下:
- 构造函数会在进栈后,先创建自己的实例对象。
- 初始化 this 的时候,指向创建的是实例对象。
- 如果构造函数没写 return 或者 返回一个原始类型的值,则默认把创建的实例对象返回;只有自己手动返回的是对戏,才以自己返回的值为主。
构造函数执行不带小括号
// new Fn; 其实也会把构造函数执行,其实这可以理解成跟普通函数执行的差异。
// 不过没传参数哦
let f2 = new Fn;
执行过程如下:
带参实例化和无参实例化的区别:
- 很明显,无参实例化的写法不能带参数
- 带参实例化的 new 操作符优先级为 20,无参为 19
你学废了么!