this参数
解析器(浏览器)在调用函数时每次都会向函数内部传递一个隐含的参数
这个隐含的参数就是this,this指向的是一个对象
这个对象我们称为函数执行的上下文对象
根据函数的调用方式的不同,this会指向不同的对象
- 以函数的形式调用时,this永远都是window
- 以方法的形式调用时,this就是调用方法的那个对象 谁调用,this就是谁
- 当以构造函数的形式调用时,this就是新创建的那个对象
构造函数
一般首字母大写(不是强制要求的,但是尽量大写 ,如这里的Person)
构造函数与普通函数的区别就是调用方式不同 普通函数是直接调用,而构造函数需要使用new关键字调用
使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类
我们将通过一个构造函数创建的对象,称为是该类的实例- instanceof
instanceof可以检查一个对象是否是一个类的实例
语法:
对象 instanceof 构造函数
如果是,则返回ture,否则返回false
执行流程
1. 立刻创建一个新的对象
2. 将新建的对象设置为函数中的this
3. 逐行执行函数中的代码
4. 将新建的对象作为返回值返回
实例:
使用构造函数可以解决工厂方法中所有对象都是object类型的问题
如例子中分了两个类 一个person和一个dog
这样可以使我们更方便区分不同类型的对象
function Person (name , age , gender){
this.name = name;
this.age = age;
this.gender = gender;
this.sayName = function(){
alert(this.name);
};
}
function Dog (){
}
var per = new Person("孙悟空",18,"男");
var per2 = new Person("白骨精",16,"女");
var per3 = new Person("猪八戒",38,"男");
var dog = new Dog();
console.log(per);
console.log(per2);
console.log(per3);
console.log(dog);
console.log(per instanceof Person);
问题:
问题一
代码中第5~7行中使用如下代码
this.sayName = function(){alert(this.name);};
直接在Person类中创建sayName方法有一点弊端,那就是代码执行几次,就创建多少个sayName方法
而且创建的sayName方法都是唯一的,但是在这里根本就没有必要创建这么多sayName方法
可以使用原型对象来解决
问题二
以上代码编写没有错误,可能使浏览器的原因,火狐浏览器中控制台返回的还是object
然后在另一个浏览器中控制台没有问题
这是第二张图的代码
function Person(){
this.name = "ll";
}
var per = new Person();
console.log(per);