作用域安全的构造函数
- 构造函数
(非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);
}
}
- 构造函数窃取模式
(使用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, "刘海柱")//原型