JS中自定义构造函数

创建对象的方法有两种: 字面量const obj = {}和构造函数const obj = new Object()
这个构造函数就是JavaScript程序定义好的构造函数,直接使用就可以了。所谓的构造函数实际上也是一种函数
构造函数专门用于生成,定义对象。通过构造函数生成的对象,称为实例化对象
构造函数就是一种函数,是专门用于生成对象的函数。实例化对象就是通过构造函数生成的对象,称为实例化对象
构造函数分为两种,一种是JavaScript程序定义好的构造函数,称为 内置构造函数。一种是程序员自己定义的构造函数,称为自定义构造函数

构造函数和普通函数的区别
①构造函数一定要和关键词new一起使用。new关键词具有特殊的功能,会自动给构造函数中定义一个对象,并且返回这个对象。我们只要对这个对象设定属性,设定方法就可以了
②构造函数为了和其他函数有区别,语法规范规定构造函数的函数名称第一个字母必须大写,使用大驼峰命名法
③构造函数给对象定义属性和方法的语法与一般函数不同
实例化对象和普通的对象没有任何的区别,只是建立方式不同而已

自定义构造函数,注意:
①函数名称要使用大驼峰命名法
②自定义构造函数中不要定义对象和定义return,new关键词会执行。如果定义了会产生冲突

            function CrtObj(name,age,sex,addr){
            // 在构造函数中使用this来指代对象,这个对象就是我们使用构造函数生成的实例化对象
            
            // 定义属性
            // 给实例化对象添加name属性,属性值是输入的name参数
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.addr = addr;

            // 定义方法
            this.funAll = function(){
                console.log(this.name,this.age,this.sex,this.addr )
            }
            this.funNameAge = function(){
                console.log(this.name,this.age)
            }
            this.funSexAddr = function(){
                console.log(this.sex,this.addr )
            }
        }

        // 通过自定义构造函数来生对象,实例化对象
        // 调用执行构造函数时,都必须要和new关键词一起使用
        const obj1 = new CrtObj('张三',18,'男','北京');
        console.log(obj1);
        // 调用 对象/实例化对象 中的方法
        obj1.funAll();
        obj1.funNameAge();
        obj1.funSexAddr();

new的作用:
①在构造函数中自行创建一个对象,并且返回这个对象
②因为new关键词创建了对象,此时构造函数中的this才会指向这个对象,也就是将来生成的实例化对象
③所有的构造函数中this的指向,都是将来通过这个构造函数生成的实例化对象

通过同一个构造函数生成的实例化对象,属性相同,属性值可能不同,定义的方法的程序是相同的。但是如果做一个比较判断,结果是false,表示不同的实例化对象中,定义的是不同的方法/函数。不同的方法和函数会占用过多的内存空间,要想办法让使用同一个构造函数生成的实例化对象都是相同的方法
原因:每次创建对象都会在对象上定义一个新的方法,也就是新的函数。函数存储时会生成一个独立的存储空间,不同函数有不同的存储空间
解决的方式:将构造函数需要定义给实例化对象的方法定义在函数的prototype属性中

            function CrtObj2(name, age, sex, addr) {
            // 定义属性
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.addr = addr;
        }
        // 在构造函数的 prototype 属性中来定义实例化对象的方法
        CrtObj2.prototype.fun = function(){
            console.log(this.name, this.age, this.sex, this.addr);
        }

        const obj4 = new CrtObj2('张三',18,'男','北京');
        const obj5 = new CrtObj2('李四',19,'女','上海');

        console.log(obj4);
        console.log(obj5);

        // obj4.fun();
        console.log( obj4.fun === obj5.fun );

prototype是每个函数本身就具有的一个特殊的属性,可以在这个特殊的属性中存储数据和函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值