首页 > 其他分享 >JS 构造函数

JS 构造函数

时间:2022-09-20 19:57:21浏览次数:67  
标签:name age JS var new sex 构造函数

什么是构造函数

在JavaScript中,用new关键字来调用的函数,称为构造函数,构造函数首字母一般大写

 

 

使用构造函数的场景

var p1 = { name:'Tom',age:'18',sex:'男'};
var p2 = { name:'Jerry',age:'18',sex:'男'};
var p3 = { name:'Speike',age:'20',sex:'男'};
var p4 = { name:'Tyke',age:'8',sex:'男'};、
var p... = {...}

如果有很多对象,那么重复很多次,出现代码冗余

 

当做构造函数的参数传入,我们可以由此创建出如下函数

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

我们可以通过new关键字,也就是通过构造函数来创建对象了

var p1 = new Person('Tom', '18', '男');
var p2 = new Person('Jerry', '18', '男');

此时,我们发现,创建对象,会很方便,在此场景下,产生很多重复代码,而使用构造函数就可以实现代码的复用。

构造函数执行过程

function Animal(color) {
 this.color = color;
}

此时的Animal函数还不算一个构造函数,当它有一个new关键字来调用时,我们才能说它是一个构造函数。如下面这样

var dog = new Animal("black");

执行过程:

function Person(name, age, sex) {
    this.name = name;
    this.age= age;
    this.sex= sex;
}
var p1 = new Person('Tom','男','18');

 

此时,Person构造函数会有一下几个执行过程。

1、当以new关键字调用,会创建出一个新的工作空间,标记为Person的实例 ,内存分配
2、将空对象的原型绑定为new操作符后面的构造函数的原型
3、函数体内部的 this 指向该内存,并执行构造函数的函数体,创建相关属性和方法
4、判断执行结果是否返回了新的对象,如果有返回新对象,就是用返回的新对象,没有的话,返回原来创建的对象(obj)

5、constructor:这是实例对象都自动含有的属性,指向他们的构造函数 

 

 

缺点:每个函数都会开辟一块新的内存,造成内存浪费

解决方法:原型

 

 

  console.log(car.constructor === Car)//true

car.__proto__ === Card.prototype // true

 

每定义一个函数,这个函数就带有一个prototype的属性,__proto__指向被实例化的构造函数的prototype,

prototype默认带有constructor属性,constructor指向构造函数。

 

 

 

 

构造函数的问题

构造函数方法虽然好用,但是存在浪费内存的问题。对于每一个实例对象,tyre都是一样的内容,每一次生成一个实例,都必须 生成重复的内容,多占用内存。既不环保也缺乏效率

    function Car(brand, color) {
        this.brand = brand
        this.color = color
        this.tyre = function () {
            console.log('我有三个轮子')
        }
    }
    var c1 = new Car('三蹦子', '蓝色')
    var c2 = new Car('电动三轮', '白色')
    console.log(c1.tyre === c2.tyre)//false

 

prototype原型

js中,每一个构造函数都又有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。实例化的__proto__指向构造函数的原型对象。

    function Car(brand, color) {
        this.brand = brand
        this.color = color
    }
    Car.prototype.tyre = function () {
        console.log('我有三个轮子')
    }
    var c1 = new Car('三蹦子', '蓝色')
    var c2 = new Car('电动三轮', '白色')
    console.log(c1.tyre === c2.tyre)//true
    console.log(c1.__proto__ === Car.prototype)//true

 

 

总结:

  1. 构造函数有一个原型对象,通过pototype获取
  2. 构造函数创建 实例对象后,每个对象都有一个私有的__proto__属性,指向构造函数的原型对象

 

对象与构造函数的关系

对象是由构造函数造出来的

  1. Object是Function 的一个实例。

    Object.constructor  == Function  //true

     

2、函数是Function 的实例,但不是Object 的实例。

function fn(){}
fn.constructor  == Function  //true
fn.constructor  == Object    //false 

3、{} 与 Object 的关系

var obj = {};
obj.constructor  === Object   //true

 

 

用instanceof 可以检查一个对象是否是一个类的实例,是则返回true;

 

 

标签:name,age,JS,var,new,sex,构造函数
From: https://www.cnblogs.com/mc-congxueda/p/16712256.html

相关文章