JS中的 this
- 调用函数时,每次都会向函数内部传递一个隐含的参数, 这个隐含的参数就是 this
- this 指向的是一个对象,这个对象我们称为函数执行的上下文对象
- 根据函数的调用方式(和创建方式没有关系)的不同,this 会指向不同的对象
- 以函数的形式调用,this 永远都是 window
- 以方法的形式调用,this 就是调用方法那个对象
function fun(a,b){
console.log("a,b")
};
fun(123,456);
function fun(a,b){
console.log(this);
};
fun(123,456);
//[object Window]
例子:
//创建一个 name 变量
var name = "全局";
// 创建一个 fun()函数
function fun(){
console.log(this.name)//动态变化
}
var obj={
name:"孙悟空",
sayName:fun
}
var obj={
name:"沙和尚",
sayName:fun
}
obj.sayName();//孙悟空
obj2.sayName();//沙和尚
工厂方法创建对象:
- 大批量创建对象
- 使用工厂方法创建的对象,使用构造的函数都是object,导致无法区分多种不同的对象
function cretePerson(name,age,gender){
//创建对象
var obj=new object();
//向对象中添加属性
obj.name=name;
obj.age=age;
obj.gender=gender;
obj.sayName=function(){
alert(this.name);
}
//将新的对象返回
return obj;
}
var obj1=createPerson("孙悟空",18,"男");
var obj2=createPerson("猪八戒",28,"男");
var obj3=createPerson("沙和尚",38,"男");
console.log(obj1);
console.log(obj2);
console.log(obj3);
构造函数:
-
创建一个构造函数,专门用来创建 Person 对象的
-
构造函数就是一个普通的函数,创建方式和普通函数没有区别,构造函数习惯上首字母大写
-
构造函数和普通函数区别就是调用方式不同
-
普通函数是直接调用,构造函数需要使用 new 关键字来调用
-
构造函数的执行流程
- 立刻创建一个新的对象
- 将新建的对象设置为函数中的 this,在构造函数中可以使用 this 来引用新建的对象
- 逐行执行函数中的代码
- 将新建的对象作为返回值返回
-
使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类,我们将通过一个构造函数创建的对象,称为是该类的实例
function Person(name,age,gender){
this.name=name,
this.age=age,
this.gender=gender
}
var per = new Person("孙悟空",18,"男");
console.log(per);
- 使用 instanced 可以检查一个对象是否是一个类的实例,是返回true,不是返回false
- 任何对象和 object 做 instanceof检查返回都是true
console.log(per instanceof Person);