zoukankan      html  css  js  c++  java
  • JavaScript Patterns 3.3 Patterns for Enforcing new

    When your constructor has something like  this.member and you invoke the constructor without  new,  you’re  actually  creating  a  new  property  of  the  global  object  called member and accessible through window.member or simply member.

    // constructor
    
    function Waffle() {
    
        this.tastes = "yummy";
    
    }
    
    // a new object
    
    var good_morning = new Waffle();
    
    console.log(typeof good_morning); // "object"
    
    console.log(good_morning.tastes); // "yummy"
    
    // antipattern:
    
    // forgotten `new`
    
    var good_morning = Waffle();
    
    console.log(typeof good_morning); // "undefined"
    
    console.log(window.tastes); // "yummy" 

    This undesired behavior is addressed in ECMAScript 5, and in strict mode this  will no longer point to the global object. If ES5 is not available, there’s still something you can do to make sure that a constructor function always behaves like one even if called without new. 

    Naming Convention

    uppercase the first letter in constructor names (MyConstructor) and lowercase it in “normal” functions and methods (myFunction).

    Using that

    function Waffle() {
    
        var that = {};
    
        that.tastes = "yummy";
    
        return that;
    
    } 
    
    function Waffle() {
    
        return {
    
            tastes: "yummy"
    
        };
    
    } 
    
    var first = new Waffle(),
    
          second = Waffle();
    
    console.log(first.tastes); // "yummy"
    
    console.log(second.tastes); // "yummy"

    Disadvantage

    The link to the prototype is lost, so any members you add to the Waffle()prototype will not be available to the objects.

    Self-Invoking Constructor

    In the constructor you check whether this is an instance of your constructor, and if not, the constructor invokes itself again, this time properly with new: 

    function Waffle() {
    
        if (!(this instanceof Waffle)) {
            return new Waffle();
        }
    
        this.tastes = "yummy";
    }
    
    Waffle.prototype.wantAnother = true;
    
    // testing invocations
    
    var first = new Waffle(),
    
    second = Waffle();
    
    console.log(first.tastes); // "yummy"
    
    console.log(second.tastes); // "yummy"
    
    console.log(first.wantAnother); // true
    
    console.log(second.wantAnother); // true
  • 相关阅读:
    P1352 没有上司的舞会(树形DP入门,自底向上更新)
    链表和函数指针
    c语言中文件操作
    数据结构中的栈和堆与计算机内存划分的栈区和堆区的区别
    计算机组成原理—cpu
    Linux中一切皆文件
    G 火山哥周游世界(树上走过确切k个点的最短时间,树形dp)
    Paint Box(涂色要求相邻不能同色,求方案数,容斥)
    失衡天平
    hdu6761lyndon分解
  • 原文地址:https://www.cnblogs.com/haokaibo/p/Patterns-for-Enforcing-new.html
Copyright © 2011-2022 走看看