作用域安全的构造函数

作用域安全的构造函数

  1. 构造函数(非new操作)
    在构造函数中,使用new操作符的时候,函数的内部this指向创建的新对象实例。
function Person(age, name){
  this.age = age;
  this.name = name;
}
var person = new Person(33, "刘海柱");

上面的例子,如果没有用new,this就指向了window了

var person = Person(33, "刘海柱");
console.log( window.age,window.name) //33 "刘海柱"

解决方法:

function Person(age, name){
  if(this instanceof Person){
    this.age = age;
    this.name = name;
  }else{
     return new Person(age, name);
  }
}
  1. 构造函数窃取模式(使用call继承)
    当使用构造函数窃取模式的时候上面的方法就没用了
function Person(age, name){
  if(this instanceof Person){
    this.age = age;
    this.name = name;
  }else{
     return new Person(age, name);
  }
}
function Person2(job){
   Person.call(this, 33, "刘海柱") //关键问题
   this.job = job;
}
var person = new Person2("法师")
  • 上面构造函数Person的作用域是安全的,而Person2构造函数却不是。
  • Person2的实例通过 Person.call()来继承Person的属性,而这里的this并不是Person的实例。导致继承失败。

解决方法:

function Person(age, name){
  if(this instanceof Person){
    this.age = age;
    this.name = name;
  }else{
     return new Person(age, name);
  }
}
function Person2(job){
   this.job = job;
}
var person = new Person2("法师")
 person.prototype = new Person(33, "刘海柱")//原型

你可能感兴趣的:(作用域安全的构造函数)