一、this
在调用函数时,浏览器每次都会向函数中传递一个隐含的参数这个参数的名字叫做this,this指向的是一个对象!
this到底是谁呢?
1.当我们以函数的形式调用一个函数时,this是window
2.当我们以方法的形式调用一个函数时,this是调用方法的对象
注意:调this就是调用方法的对象,当我们不确定方法对象是谁的时候,我们就需要用到this,this的作用就相当于谁是谁,哪个谁不确定,谁调用this就是谁
// 设置一个全局变量name
var name = '全局name属性';
//定义一个对象(方法),对象里面包含着函数的就叫方法,对象的属性是函数,则我们称这个函数是这个对象的方法(method)
var obj = {
name: '孙悟空',
sayHello: fn//这个sayHello直接调用了fn函数 跟 sayHello:function fn(){}一样
};
//写在外面就是 obj.sayHello=function fn(){}
var obj2 = {
name: '猪八戒',
sayHello: fn
};
//console.log(obj.sayHello === fn);//true
// 三个打印结果一样
// obj.sayHello();
// obj2.sayHello();
// fn();
/*
修改,我们希望:
obj.sayHello()----->孙悟空--->obj.name
obj2.sayHello();----->猪八戒--->obj2.name
window.fn();----->全局name属性--->window.name
谁调用的方法就打印谁的name属性
*/
// 定义一个函数,通过函数,然后this来调用他们的方法,var name = '全局name属性'(函数形式);
function fn() {
console.log(this.name);
}
obj.sayHello();//孙悟空 以方法的形式调用一个函数时(调用obj对象的sayHello()的方法),this是调用方法的对象
obj2.sayHello();//猪八戒
window.fn();//全局name属性 以函数的形式调用一个函数时,this是window
//练习
name_test = '沙和尚';
let obj3 = {
name_test: '孙悟空',//obj3.name,打印的时候不会去属性里去找
sayHello: function () {
// // 找变量
// alert(name_test);
// 找属性
alert(this.name_test);
}
}
// obj3.sayHello();//沙和尚
obj3.sayHello();//孙悟空
二、工厂方法创建新的对象
/*
工厂方法:根据参数创建新的对象
创建一个函数,专门用来创建人类的对象(函数里面放一个对象,而函数开头是可以放形参的)
*/
function createPerson(name, age, gender, address, sayHello) {
//创建一个对象
let obj = {
name,
age,
gender,
address,
sayHello() {
alert(`大家好,我是${this.name}`);
}
//与下面写法等价
};
// // 向对象中添加属性
// obj.name = name;
// obj.age = age;
// obj.gender = gender;
// obj.address = address;
// obj.sayHello = function () {
// alert(`大家好,我是${this.name}`);
// }
// 将对象作为返回值返回
return obj;
}
let per_1 = createPerson('孙悟空', 18, '男', '花果山');
let per_2 = createPerson('猪八戒', 28, '男', '高老庄');
let per_3 = createPerson('沙和尚', 38, '男', '流沙河');
per_1.sayHello();
console.log(per_1);
console.log(per_2);
console.log(per_3);
三、构造函数
可以通过构造函数来创建对象
1.构造函数就是专门用来创建对象的函数(自定义函数是用构造函数)
2.构造函数的定义方式和普通函数没有区别,唯一的不同点在于构造函数的名字首字母要大写
3.构造函数和普通函数的区别在于调用方式,一个函数如果直接调用那么它就是一个普通函数,如果使用new关键字调用,它就是一个构造函数
4.一个构造函数也称为是一个类,通过该构造函数所创建的对象,称为该类实例,通过同一个类创建的对象,称为同一类对象
构造函数的执行流程:1.创建一个新的对象;2.将这个新的对象设置为函数中的this;3.执行函数中的代码;4.将新建的对象返回
instanceof,用来检查一个对象是否是一个类的实例
语法:对象 instanceof类(构造函数)例如:per instanceof Person
function Person(name) {
this.name = name;
}
function Dog(age) {
this.age = age;
}
// Person()//普通函数调用方式
// new Person()//构造函数调用方式
let Per = new Person('swk');//Per是Person类的实例
let Per2 = new Person('zbj');
let Dog_test = new Dog(18);
// 可以一眼看出是那个对象
console.log(Per);//Person{name:'swk'}
console.log(Per2);//Person{name:'zbj'}
console.log(Dog_test);//Dog{age:18}