解析器在调用函数时,每次都会偷偷的向函数传递一个隐含的参数,这个参数就是this, this指向一个对象
这个对象我们成为上下文对象
根据函数调用方式的不同,this指向的对象也不同
以函数形式调用fun( ),this指向window对象
以方法形式调用 obj.fun( ),this指向调用方法的那个对象
如果我们想要创建多个对象,每次都使用字面量创建,就要重复写很多遍,不妨将相同的代码提取出来,封装成一个函数,封装成创建对象的函数叫做工厂方法(批量生产)
function createPerson(name,age,sex){
var obj=new Object();
obj.name=name;
obj.age=age;
obj.sex=sex;
obj.sayName=function(){
return *this*.name;
}
//将新的对象返回
return obj;
}
var obj1=createPerson("孙悟空",18,"男");
var obj2=createPerson("猪八戒",20,"男");
var obj3=createPerson("沙和尚",38,"男");
console.log(obj1);
console.log(obj2);
console.log(obj3);
构造函数的存在前提,使用new Object创建出来的对象,对象类型都是Object,如果我们想要区分两个对象的类型,工厂方法创建对象已经不合适了,所以为了区分对象的类型,提出了构造函数
类:构造函数就是一个类
实例:构造函数新建的对象,叫做这个类的实例
使用new Object创建一个新的对象 //浏览器的工作
将新建的对象设置为函数中的this,这样我们就能**在函数内部使用this来指向新建的对象 **//浏览器的工作
逐行执行构造函数中的代码
将新建的对象返回//浏览器的工作
传什么参数就建什么对象
function fun( ) {
alert(this.name+this.age);
}
function Person(name,age){
this.name=name;
this.age=age;
this.sayHello=fun;
}
function Dog(name,age){
this.name=name;
this.age=age;
this.sayHello=fun;
}
var per=new Person("白骨精",1000);
var dog=new Dog("旺财",3);
console.log(per);
console.log(dog);
per.sayHello( );
dog.sayHello( );
我们可以用instanceof 检查一个对象是否是某个类的实例
per instanceof Person;
dog instanceof Dog
Object是所有实例的超类
使用同一个构造函数创建出来的对象,我们成为一类对象,也将构造函数称为一个类
使用构造函数新创建出的对象,我们称为该类的实例
以函数形式调用fun( ),this指向window对象
以方法形式调用 obj.fun( ),this指向调用方法的那个对象
当以构造函数的形式调用,new Person(),this就是构造函数新创建的那个对象