构造函数
构造函数就是一个普通的函数,不同的是
1.构造函数首字母大写;
2.构造函数调用方式不同,需要用new关键字来调用;
构造函数的执行流程:
1.立刻创建一个新的对象;
2.将新建的对象设置为函数中的this;
3.逐行执行函数中的代码;
4.将新的对象作为返回值返回;
使用同一个构造函数创建的对象,称为一类对象(一个构造函数称为一个类); 我们将通过一个构造函数创建的对象,称为是该对象的实例。
function Person() {
}
//没有用new关键字;
var per = Person();
console.log(per);//undefined
//用new关键字;
var per1 = new Person();
console.log(per1); //Person {}
关于构造函数的this——将新建的对象设置为函数中的this;
function Person() {
console.log(this);//Person {}
}
var per1 = new Person();
console.log(per1); //Person {}
创建一个构造函数
var name = '11';
function Person(name, age) {
this.name = name;
this.age = age;
this.sayName = function () { //每一个Person中都添加了一个构造函数内部定义的方法,构造函数每执行一次,都会创建一个新的方法;完全没有必要,可以共享一个方法;
alert(this.name);
}
}
//创建Person的实例per1,per2
var per1 = new Person('xixi', 19);
var per2 = new Person('asas', 18);
console.log(per1); //Person {name: 'xixi', age: 19, sayName: ƒ}
console.log(per1.sayName == per2.sayName);// false
提取方法,性能可以提升,占用空间少,但是也会有问题-后面继续了解原型对象解决这个问题
//定义了全局方法,会污染全局作用域的空间,也不安全,尽量不要写全局
function fun() {
alert(this.name);
}
function Person(name, age) {
this.name = name;
this.age = age;
this.sayName = fun;
}
console.log(per1.sayName == per2.sayName);// true
instanceof 可以用检查一个对象是否是另一个对象的实例
//instanceof 可以检查per1是否为Person的实例
console.log(per1 instanceof Person);//true
console.log(per1 instanceof Object);//true 老祖宗,所有的构造函数都是Object的后代
关于this的总结
-
当以函数的形式调用时,this是window
-
当以方法的形式调用时,谁调用方法this就是谁
-
当以构造函数的形式调用时,this就是新创建的那个对象