构造函数和普通函数的区别就是调用的不同,普通函数直接调用,构造函数使用new关键调用,并且构造函数首字母一般大写。
构造函数的执行流程:
1、立即创建一个新的对象
2、将新建对象设置为函数的this,在构造函数中可以使用this引用对象
3、按顺序执行函数的代码
4、将对象作为函数返回值返回
<script type="text/javascript">
//构造函数
function Person(){
alert("test");
}
var per = new Person();
console.log(per);
</script>
构造函数中this的使用
<script type="text/javascript">
//构造函数和普通函数的区别就是调用的区别,并且首字母一般大写
//构造函数的执行流程
//1、立即创建一个新的对象
//2、将新建对象设置为函数的this,在构造函数中可以使用this引用对象
//3、按顺序执行函数的代码
//4、将对象作为函数返回值返回
//
function Person(name,age,gender){
this.name = name;
this.age = age;
this.gender = gender;
this.setName = function(){
alert(this.name);
}
}
var per1 = new Person("悟空",18,"男");
var per2 = new Person("八戒",18,"男");
var per3 = new Person("沙和尚",18,"男");
per1.setName();
per2.setName();
per3.setName();
</script>
构造函数也称为类,通过构造函数创建的对象成为类的实例
使用instanceof关键字可以检查一个对象是否是一个类的实例
例:per1 instanceof Person //检查per1对象是否是Person的一个实例,是返回true,不是返回false
问题:构造函数每执行一次,就会创建一个新的方法。执行一万次就会有一万个功能相同但独立的方法。
<script type="text/javascript">
function Person(name,gender,age){
this.name = name;
this.gender = gender;
this.age = age;
this.setName = function(){
alert(this.name);
}
}
per1 = new Person("张三","男",18);
per2 = new Person("李四","男",18);
alert(per1.setName == per2.setName); //flase,setName是独立的方法
</script>
优化:
方法一:将方法放在全局中定义。缺点是污染全局变量且不安全
<script type="text/javascript">
function Person(name,gender,age){
this.name = name;
this.gender = gender;
this.age = age;
this.setName = setName;
}
function setName(){
alert(this.name);
}
per1 = new Person("张三","男",18);
per2 = new Person("李四","男",18);
alert(per1.setName == per2.setName); //true,setName是全局定义的函数
</script>
方法二:将共有的属性和方法统一放在公共区域prototype原型中
想了解原型请戳:详谈prototype和__proto__原型
<script>
function Person(name,gender,age){
this.name = name;
this.gender = gender;
this.age = age;
}
//原型prototype
Person.prototype.setName = function(){
return this.name;
}
per1 = new Person("张三","男",18);
per2 = new Person("李四","男",18);
alert(per1.setName()); //1
alert(per1.__proto__.setName()); //2
</script>
this的情况:
1、当以函数的形式调用时,this是window
2、当以方法的形式调用时,谁调用方法this就是谁
3、当以构造函数的形式调用时,this就是新创建的那个对象