1.构造函数和普通函数的区别:
首先,功能上:构造函数是初始化对象的
写法上:构造函数的首字母要大写(当然,你不想大写也可以)
调用方式:普通函数是直接调用,而构造函数需要使用new关键字来调用
2.构造函数执行流程:
- 创建一个空对象
- 可以用this指向新创建的对象
- 逐行执行代码
- 返回新创建的对象
注意:
返回时,相当于已经有返回值了,如果你还是想写return给它一个返回值,那么简单类型是不能返回的,复杂类型会覆盖我们的对象
3.用new声明的对象,我们称为实例对象,和普通函数一样,构造函数在实例化时,也是可以传参的
function Person(name,age){
this.name = name;
this.age = age;
}
let p1 =new Person('张三','18')
4.使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类我们将通过一个构造函数创建的对象,称为该类的实例
在同一个类,是具有相同特征的,例如:一个人'类',人都有两只眼睛,一只鼻子,一张嘴巴,年龄特征,名字特征,动作特征什么的,动作我们可以通过方法来写
5.检查一个对象是否是一个类的实例
可以通过instanceof来检查 语法:对象instanceof 构造函数(如果是,返回true,否则返回false)
6.this
- 当以函数的形式调用时,this是window
- 当以方法的形式调用时,谁调用方法,this就是谁
- 当以构造函数的形式调用时,this就是新创建的那个对象
7.原型对象
1.原型对象产生:当函数产生时,系统会自动创建一个对应的对象,称之为原型对象
2.作用:减少内存,防止变量名污染
3.原型prototype
往原型对象里面添加属性:构造函数.prototype.属性名 = 属性值.
4.找到我们的原型的属性
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.eat = function(){
console.log('吃东西');
}
console.log(Person.prototype.eat);//通过构造函数.prototype.属性名
let p1 =new Person('张三','18')
p1.eat()//p1.__proto__.eat(),__proto__可省略
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中
我们可以用in来检查对象中是否有某个属性,返回布尔值 假如对象没有但是原型中有,也会返回true
console.log('eat' in p1);
通过原型对象找相对应的构造函数:constructor
console.log(p1.__proto__.constructor);
p1.__proto__//相当于通过我们的实例对象p1找到了我们的原型对象
8.拓展:
原型对象也是对象,所以它也有原型,也像套娃
console.log(p1.__proto__.__proto__);p1原型对象里的原型对象Object
console.log(mc.__proto__.__proto__.__proto__)Object的原型对象就没有了,返回null
当我们使用一个对象的属性或方法时,会先在自身中寻找, 自身如果有,则直接使用,如果没有则去原型对象中寻找,如果原型对象中有,则使用,如没有则去原型的原型中寻找Object对象的原型没有原型,如果在Object中依然没有找到,则返回undefined
总结:原型找不到返回null找不到属性返回undefined