• 高级函数之作用域安全的构造函数


    构造函数都知道。就是一个使用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
    
    

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

  • 相关阅读:
    ARM Linux 3.x的设备树(Device Tree)
    ubuntu 14.04 编译内核出现unable to locate package ncurses-devel 问题的解决
    Device Tree Usage( DTS文件语法)
    Ubuntu 14.04中gedit打开文件出现中文乱码问题
    Jenkins中集成jmeter-maven插件
    Linux(centos6.5)下安装jenkins
    IM系统架构设计之浅见
    一些常用软件的网络端口协议分类介绍
    Jenkins执行批处理文件失败
    八大持续集成工具
  • 原文地址:https://www.cnblogs.com/bbqq1314/p/12545478.html
Copyright © 2020-2023  润新知