zoukankan      html  css  js  c++  java
  • 高级函数之作用域安全的构造函数

    构造函数都知道。就是一个使用new操作符调用的函数。当使用new 调用时,构造函数内用到的this对象会指向新创建的对象实例。

    function Person(name,age,job) {
        this.name = name;
        this.age = age;
        this.job = job;
    }
    let person = new Person('yk',27,'software Engineer')
    

    上面这个例子中,Person构造函数使用this对象给三个属性赋值,name,age和job。问题时当没有new时候,直接调用,this会映射到全局window上面。创建一个作用域安全的构造函数可以解决这个问题。

    function Person(name,age,job) {
        if(this instanceof Person) {
                this.name = name;
                this.age = age;
                this.job = job;
        } else {
            return new Person(name,age,job)
        }
    }
    

    eg2:

    function Polygon(sides) {
        if(this instanceof Polygon) {
            this.sides = sides;
            this.getArea = function() {
                return 0;
            }
        } else {
            return new Polygon(sides)
        }
    }
    
    
    function Rectangle(width,height) {
        Polygon.call(this, 2);
        this.width = width;
        this.height = height;
        this.getArea = function() {
            return this.width * this.height;
        }
    }
    
    let rect = new Rectangle(5, 10);
    alert(rect.sides)  //undefined
    
    
    

    由于Polygon构造函数是作用域安全的,this对象并非Polygon的实例,所以会创建并返回一个新的Polygon对象,Rectangle构造函数中的this对象并没有得到增长。同时Polygon.call()返回的值也没用到,所以Rectangle实例中就不会有sides属性。

    function Polygon(sides) {
        if(this instanceof Polygon) {
            this.sides = sides;
            this.getArea = function() {
                return 0;
            }
        } else {
            return new Polygon(sides)
        }
    }
    
    
    function Rectangle(width,height) {
        Polygon.call(this, 2);
        this.width = width;
        this.height = height;
        this.getArea = function() {
            return this.width * this.height;
        }
    }
    
    Rectangle.prototype = new Polygon();
    
    let rect = new Rectangle(5, 10);
    alert(rect.sides)  //2
    
    

    扫码加群,每日更新一篇前端技术文章一起成长。

  • 相关阅读:
    单机安装hadoop+hive+presto
    java ListMap使用多个key比较
    java多线程-3-使用多线程的时机
    java多线程-2-概念和实现机制
    mysql的varchar和oracle的varchar2比较
    js-对象创建
    java关于json的一些问题
    spring使用RedisCacheManager管理key的一些问题
    如何提高工作效率
    关系数据库之-事务
  • 原文地址:https://www.cnblogs.com/bbqq1314/p/12545478.html
Copyright © 2011-2022 走看看