IT技术之家

首页 > 前端

前端

JS构造函数_Suda Masaki534

发布时间:2023-12-10 03:03:22 前端 18次 标签:javascript 前端 ecmascript
含义:在 JavaScript 中,用 new 关键字来调用的函数,称为构造函数。构造函数首字母一般大写(我的理解是:构造函数是用来创建一个对象的,所有的对象都是被new 构造函数()出来的,只要一个函数(内置、自定的),通过new被调用的 这个函数就可以被叫做构造函数)一、构造函数的优点:在语法上提供一个简洁的书写方式,为了开发者的便利举个例子:如果我们想录入班上同学的个人信息,会这样创建对象var m1 = { name: '张三', age: 21, sex: '男'...

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

(我的理解是:构造函数是用来创建一个对象的,所有的对象都是被new 构造函数()出来的,只要一个函数(内置、自定的),通过new被调用的 这个函数就可以被叫做构造函数)


一、构造函数的优点

在语法上提供一个简洁的书写方式,为了开发者的便利

举个例子:

如果我们想录入班上同学的个人信息,会这样创建对象

var m1 = { name: '张三', age: 21, sex: '男', hobby: 'basketball' };
var m2 = { name: '李四', age: 20, sex: '女', hobby: 'dancing' };
var m3 = { name: '王五', age: 22, sex: '女', hobby: 'singing' };
var m4 = { name: '赵六', age: 23, sex: '男', hobby: 'football' };

但是如果人数过多,最终我们要将以上代码编写n次,效率过低,所以这时候我们可以运用构造函数,将name、age、sex、hobby当做构造函数的参数传递进去。

function Msg(name, age, hobby, sex) {

            //new关键字帮助我们做了一系列的事
            // 1.在函数内部创建了一个空对象
            // 2.在函数中的this指向这个空对象   this-》 {}Obj
            // 3.逐条执行函数中的代码
            // 4.隐式返回这个对象

            //obj.name = name->{name:'张三'}
            this.name = name;  
            //obj.age = name->{name:'张三',age:'21'}
            this.age = age; 
            //obj.hobby = name->{name:'张三',age:'21',hobby:'basketball'}   
            this.hobby = hobby;
            //obj.sex = name->{name:'张三',age:'20',hobby:'basketball',sex:'女'}
            this.sex = sex;    
        }
        

?当创建上面的函数以后, 我们就可以通过 new 关键字调用,也就是通过构造函数来创建对象了。

        var m1= new Msg('张三', '21', 'basketball', '男');
        var m2= new Msg('李四', '20', 'dancing', '女');
        var m3= new Msg('王五', '22', 'singing', '女');
        var m4= new Msg('赵六', '23', 'football', '男');
       
        console.log(m1);  //object对象 {}  空对象  var  obj ={}
        console.log(m2);
        console.log(m3);
        console.log(m4);

?此时创建对象会变得非常方便,虽然封装构造函数的过程会比较麻烦,但一旦封装成功,我们再创建对象就会变得非常轻松,这也是我们为什么要使用构造函数的原因。


二、构造函数执行过程

function Flower(color) {

            this.color = color;
            this.price = price;

}

当一个函数创建好以后,我们并不知道它是不是构造函数,即使像上面的例子一样,函数名为大写,我们也不能确定。只有当一个函数以 new 关键字来调用的时候,我们才能说它是一个构造函数。

所以我们总结一下:

(1) 当以 new 关键字调用时,会创建一个新的内存空间,标记为 Animal 的实例。

(2)函数体内部的 this 指向该内存

var rose = new Flower("red",'50');   //创建一个新的内存   #one
var yellowrose = new Flower("yellow",'40');    //创建一个新内存   #two
var last= new Flower("pink",'30');    //创建一个新内存   #three

?每当创建一个实例的时候,就会创建一个新的内存空间(#one, #two),创建 #one 的时候,函数体内部的 this 指向 #one, 创建 #two 的时候,函数体内部的 this 指向 #two。

(3) 执行函数体内的代码
通过上面的讲解,你就可以知道,给 this 添加属性,就相当于给实例添加属性。

(4) 默认返回 this

由于函数体内部的this指向新创建的内存空间,默认返回 this ,就相当于默认返回了该内存空间,也就是上图中的 #three。此时,#three的内存空间被变量last所接受。也就是说 last这个变量,保存的内存地址就是 #three,同时被标记为 Flower的实例。


以上就是构造函数的整个执行过程。