构造函数

155 阅读3分钟

1.构造函数和普通函数的区别:

首先,功能上:构造函数是初始化对象的

写法上:构造函数的首字母要大写(当然,你不想大写也可以)

调用方式:普通函数是直接调用,而构造函数需要使用new关键字来调用

2.构造函数执行流程:

  1. 创建一个空对象
  2. 可以用this指向新创建的对象
  3. 逐行执行代码
  4. 返回新创建的对象
注意:

返回时,相当于已经有返回值了,如果你还是想写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

  1. 当以函数的形式调用时,this是window
  2. 当以方法的形式调用时,谁调用方法,this就是谁
  3. 当以构造函数的形式调用时,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