如何判断构造函数被实例化了几次

hibehero
  • 42
function Fun(){

}

var fun1 = new Fun();
var fun2 = new Fun();
回复
阅读 4.1k
4 个回答
✓ 已被采纳

就是判断你的代码执行了几次么。做一个计数不就解决了
clipboard.png

先说 @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,但是仍然增加了计数。解决办法有两个

  1. 判断不是 new 调用,就不计数

  2. 将非 new 调用转换为 new 调用

这两种解决办法的根本其实就是一个,判断是否 new 调用。网上讲解决办法的比较多,就不细说了,给个参考:JavaScript中判断函数是new还是()调用

fun1===fun2//?true就一次,false就两次

你知道吗?

宣传栏