• 怎样解决忘加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
  • 相关阅读:
    20180925-5代码规范
    20180925-4 单元测试,结对
    20180925-6 四则运算试题生成
    20180925-3 效能分析
    20170925-2 功能测试
    20180925-7 规格说明书——吉林市两日游
    20180918-1 词频统计
    第二周例行报告
    iOS开发-CocoaPods使用详细说明
    svn的使用详解
  • 原文地址:https://www.cnblogs.com/aisowe/p/11652754.html
Copyright © 2020-2023  润新知