function Fun(){
}
var fun1 = new Fun();
var fun2 = new Fun();
先说 @linong 的办法是可行的,
function Fun() {
Fun.newCount++;
}
Fun.newCount = 0;
但是有一个问题,Fun.newCount
谁都可以改。那当然,如果不关心这个问题,后面的内容就可以忽略了。
如果不让改怎么办——典型的解决办法,闭包
不得不说,下面的语法是 es6 的,但是可以完全使用 es5 的语法替代。之所以用 es6,是因为我希望能推动 es6 的推广。如果看不懂 es6 语法,请在评论中提出来,我把翻译后的贴在评论中。
const Fun = (function() {
// 这是一个闭包起来的变量
let newCount = 0;
// 定义 Fun 类
class Fun {
// 通过只读属性获得统计值,
// 该属性只读,不可写,所以外部不能改变
static get newCount() {
return newCount;
}
constructor() {
newCount++;
}
}
return Fun;
})();
new Fun();
new Fun();
console.log(Fun.newCount);
上面的示例是用 es6,如果直接在 es6 的环境下运行,这也就算完了。但是如果改写成 es5,或者直接用 es5 的语法来写,就会出现一个新的问题,坑之所在,比如
//... 代码接上面
var a = Fun(); // 注意,没用 new
console.log(a, Fun.newCount); // undefined, 3
因为没用 new
关键字,Fun()
返回的是 undefined
,但是仍然增加了计数。解决办法有两个
判断不是 new
调用,就不计数
将非 new
调用转换为 new
调用
这两种解决办法的根本其实就是一个,判断是否 new
调用。网上讲解决办法的比较多,就不细说了,给个参考:JavaScript中判断函数是new还是()调用
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
就是判断你的代码执行了几次么。做一个计数不就解决了