zoukankan      html  css  js  c++  java
  • 怎样解决忘加new关键字所造成的问题

    通过构造函数 "new" 一个对象出来时, 如果忘记写这个 new, 那这个构造函数就不会返回一个实例对象, 而是会像普通函数一样执行. 下面是两种规避忘记写new时所引发的问题的方法: 

    1. 使用严格模式, 只需要在函数体内部第一行加一个单独的字符串: "use strict", 就可以在没有new时直接报错, 以此提前知道哪里有问题.

    function Person(name){
        "use strict"
        this.name = name;
    }
    
    var Lilei = Person("Lilei"); // Error

    2. 在函数内部检测是否加 new, 如果没有, 那就返回一个带 new 的构造函数.

    function Person(name){
        if(!(this instanceof Person)) {
            return new Person(name);
        }
        this.name = name;
    }
    
    var Lilei = Person("Lilei");
    Lilei.name; // "Lilei"

    3. 使用new.target检测是否加new

    function Person(name) {
        if(!new.target) return new Person(name);
        this.name = name;
    }
    
    var lilei = Person("Lilei");
    lilei.name; // "Lilei"

    注意, 第二种方法检测的是构造函数在调用时的this指向, 因为如果不加new, 那这里的this就指向window(严格模式下指向undefined), 因此可以通过this指向来判断是否有 new;

    function isThisEqualWindow(){
        return this;
    }
    
    isThisEqualWindow() === window; // true
  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/aisowe/p/11652754.html
Copyright © 2011-2022 走看看