构造函数

什么是构造函数

1.定义
用 new 关键字来调用的函数,称为构造函数

2.要求

  • 构造函数首字母一般要求大写
    其实大小写都可以,不过大写是为了别人看见这个之后,知道这是个构造函数

3.用途
构造函数主要用来创建对象
一般把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面

function Person() {

}
var person1 = new Person();
console.log(typeof person1);	//object

4.好处
用函数创建对象,可以减少繁琐的对象创建流程,从而实现代码的复用

var person1 = {
  name:'a',
  age: 18,
};
var person2 = {
  name: 'b',
  age: 19,
};
var person3 = {
  name: 'c',
  age: 20
};


function Person(name, age) {
  this.name = name,
  this.age = age
}

var person4 = new Person('d', 18);
var person5 = new Person('e', 19);
var person6 = new Person('f', 20);

//如果创建1000个人都使用对象字面量的方式就会产生很多重复的代码
//而使用构造函数就会避免这种重复的产生

静态成员和实例成员

构造函数可以添加一些成员,这些成员可以在构造函数本身上添加,也可以在构造函数内部的 this 上添 加。通过这两种方式添加的成员,就分别称为静态成员和实例成员

  • 静态成员:在构造函数本上添加的成员称为静态成员,只能由构造函数本身来访问
  • 实例成员:在构造函数内部创建的对象成员称为实例成员,只能由实例化的对象来访问

实例成员也就是构造函数内部通过this添加的成员

function Person(name, age) {
  //name、age都是实例成员
  this.name = name,
  this.age = age
}

//静态成员
Person.school = 'school';

var person1 = new Person('a', 18);
console.log(person1.school); //undefined
console.log(Person.school); //school
console.log(Person.age);  // undefined
console.log(person1.age); //18

new 的作用

new 在执行时会做四件事情:
1.调用关键字 new 时,会在内存中开辟一个新的空间,用来存放这个对象
2.让 this 指向这片内存(也就是 this 指向这个对象)
3. 执行构造函数里面的代码,给这个新对象添加属性和方法
4.默认返回 this ,也就是将这块内存空间返回(this 已经指向了这块内存空间)(所以构造函数里面不需要写 return )

function Person(name, age) {
  //var this = {}
  this.name = name,
  this.age = age
  // return this
}
关于 return

如果出现了return,返回的是原始值的话,会直接忽略掉;但如果是一个对象的话,则会返回这个对象

function Person(name, age) {
  this.name = name,
  this.age = age
  return 123
}

var person1 = new Person('a', 18);
console.log(person1); //Person {name: "a", age: 18}

function Test(name, age) {
  this.name = name,
  this.age = age
  return {
    name: '武汉加油',
    age: 2020
  }
}

var test = new Test('a', 18);
console.log(test); //{name: "武汉加油", age: 2020}

所有的对象最终都是通过构造函数创建的

var arr = [1, 2, 3, 4, 5];
// 相当于下面的
var arr = new Array(1, 2, 3, 4, 5);

var obj = {
    name: 'a', 
    age: 18
};
// 相当于
var obj = new Object();
obj.name = 'a';
obj.age = 18;

如何判断某个函数是否通过 new 来调用

new.target 该表达式在函数中使用,返回的是当前的构造函数,但是是,如果该函数不是通过new 调用的,则返回 undefined

通常用于判断某个函数是否通过 new 在调用,不通过时返回 undefined

function Person() {
  console.log(new.target)
}

var test1 = Person();	//undefined
var test2 = new Person(); //Person(){...}

防止没有函数通过 new 调用

function Person(name, age, sex) {
    if(new.target === 'Person') {
        this.name = name;
        this.age = age;
        this.sex = sex;
    } else {
        return {
            name,
            age,
            sex
        }
    }
}

函数的本质

函数的本质就是对象

所有的函数都是通过new Function创建的

Function -> 产生的函数对象 -> 产生普通的对象

由于函数本身就是对象,因此函数中,可以拥有各种属性

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.a = 123;
console.log(Person.a); //123
Person.test = function() {
    console.log('test');
}
Person.test();  //test
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值