ES6构造函数class语法与ES5构造函数语法

这段时间在逆战班学习了面向对象相关内容,其中关于构造函数的两种语法我这里说一下。
1.ES5构造函数语法
(1)什么是构造函数呢?
构造函数就是一种专门用于生成对象的函数,通过构造函数生成的对象称为实例化对象。
(2)ES5构造函数语法
先看代码:
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关键词生成实例化对象,再通过对象的操作就可以调用属性和方法。
注:需要注意一个小问题,就是通过一个构造函数生成的实例化对象,其中的方法都是相同的,但是地址却不同,会占用过多的内存
const obj2 = new CrtObj(‘张三’,18,‘男’,‘北京’);
const obj3 = new CrtObj(‘李四’,19,‘女’,‘上海’);
const obj4 = new CrtObj(‘王五’,20,‘不详’,‘火星’);
我通过这个构造函数生成不同的三个实例化对象,可以看到其中的属性是相同的,属性值可能不同,我定义方法的程序是完全相同,那么下面就输出两个对象调用相同方法的比较
console.log( obj1.funAll == obj2.funAll );
在这里插入图片描述
可以看到输出的结果是false,因此明明是同一个方法,却会分别占用内存,其解决办法就是通过原型对象来解决,我这里简单写一下语法:
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.fun === obj5.fun );
这里的输出结果是true,内存地址是相同的了。
(3)原型属性和原型对象
每一个函数都天生有一个prototype属性,称为原型对象,是一个专门用来存储数据、函数的空间,而每一个对象,天生有一个_prto_属性,称为原型属性,我们实例化对象的原型属性指向创建它的构造函数的原型对象。
因此上述代码中我将方法存储在构造函数的原型对象中,那么它生成的所有实例化对象调用方法时都会通过_proto_找到这个构造函数prototype属性中存储的方法。从而解决了上述小问题。
2.ES6构造函数语法
ES6中,新增了class类语法形式,它的作用和原理与ES5语法是完全相同的,只是语法形式不同而已。具体看下代码:
// 1,ES5语法
function Fun1(name,age){
this.name = name;
this.age = age;
}
Fun1.prototype.f1 = function(){
console.log(this.name , this.age);
}

    // 2,ES6语法  class
    class Fun2{
        constructor(name,age){
            this.name = name;
            this.age = age;
        }

        f2(){
            console.log(this.name , this.age);
        }
    }

    const obj1 = new Fun1('张三',18);
    const obj2 = new Fun2('李四',20);

这样一对比可以看出是非常相似了。
ES6语法的特点:(1)声明构造函数是通过class类声明的
(2)传参与定义属性是写在constructor构造器中的
(3)方法不需要写上prototype单词,甚至不需要写function关键词,然而这只是ES6语法帮我们给补上了而已,本质还是一样的
(4)最后一样通过new关键词生成实例化对象。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ES6class是一个语法糖,它提供了更接近传统语言的写法,引入了的概念。ES6classES5的原型对象写法实现的功能基本相同,但class语法让对象原型的写法更加清晰、更像面向对象编程的语法class的基本语法是使用关键字class定义一个名可以自定义,然后使用constructor方法定义构造函数,constructor方法会在实例化对象时被调用。其他方法则直接定义在的内部,不需要再用prototype来定义。例如,下面是一个使用ES6 class语法定义的Point的例子: ``` class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + this.x + ', ' + this.y + ')'; } } ``` 上述代码定义了一个Point,它有一个构造函数constructor,接受x和y两个参数,并将它们赋值给的实例对象的属性。还定义了一个toString方法,用于返回表示坐标的字符串。使用这个创建实例对象的方式如下: ``` let point = new Point(1, 2); console.log(point.toString()); // 输出 (1, 2) ``` 通过这个例子我们可以看到,ES6class语法让定义和使用更加简洁和直观。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Class 的基本语法](https://blog.csdn.net/weixin_44954172/article/details/103505657)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [ES6class的基本语法)](https://blog.csdn.net/qq_43327305/article/details/102718892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值