作用域安全的构造函数

来源:互联网 发布:全国流动人口监测数据 编辑:程序博客网 时间:2024/05/18 03:32

问题引入:

之前看到《js语言精粹》上,介绍js语言的糟粕,其中之一就是全局对象。当在使用构造函数时,可能忘记写new,那对象就添加到了全局对象window上,导致了错误对象属性的意外增加。

比如,一个构造函数:

function Person(gender,age){    this.gender = gender;    this.age = age;}

正确的打开方式应该是var p = new Person(),this指向新创建的对象。但是当忘记使用new时,如var p1 = Person(), 相当于直接调用函数,this指向全局对象。

var p = new Person('女',18);console.log(p.gender); //weiconsole.log(window.gender); //undefinedvar p1 = Person('男',23);console.log(p1.gender); //Error,p1为undefinedconsole.log(window.gender); //xiao

作用域安全的构造函数:不论是否使用new,都返回一个Person的新实例。

function Polygon(sides) {    if (this instanceof Polygon) {      this.sides = sides;      this.getArea = function() {        return 0;      }    } else {      return new Polygon(name);    }  }  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(); //原型链继承,实现Rectangle实例也是一个Polygon实例,从而通过Polygon构造函数中`if (this instanceof Polygon)`的校验。  var rect =  new Rectangle(5,10);  alert(rect.sides);