码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-03-22 13:41:21      阅读:51      评论:0      收藏:0      [点我收藏+]

标签:undefined   job   call   keyword   else   lang   每日   作用   on()   

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

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

技术图片

 

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

标签:undefined   job   call   keyword   else   lang   每日   作用   on()   

原文地址:https://www.cnblogs.com/bbqq1314/p/12545478.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!