首先我们来了解一下类定义

类是用来描述现实事物的,由属性和行为组成。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。

constructor

一个类只能有一个constructor方法
在function定义的构造函数中,其prototype.constructor属性指向构造器自身
在class定义的类中,constructor其实也相当于定义在prototype属性上

class Pon{constructor(a) {// ...这了可以定义实例属性this.a = a;}int(){   }
}// 等同于
function Pon(){this.a = a;
}
Pon.prototype.int= function (){   }

ES6 class与ES5 构造函数区别

声明区别

ES6 中的 class 是不可以重复定义的重复定义是会报错的

ES5中的function 声明构造函数会却覆盖之前定义的方法

class没有变量提升是没有变量提升的
function 声明构造函数会却变量提升(js预编译)

枚举区别

class Point {constructor(x, y) {this.x = x;this.y = y;}int() {console.log(x,y)}
}
Object.keys(Point.prototype)
Object.getOwnPropertyNames(Point.prototype)function Point1 (x, y) {this.x = x;this.y = y;
};
Point1.prototype.int = function() {console.log(x,y)
};
Object.keys(Point1.prototype)
Object.getOwnPropertyNames(Point1.prototype)

class中定义的方法不可用Object.keys(Point.prototype)枚举到
function构造器原型方法可被Object.keys(Point.prototype)枚举到
但是不管是class还是function,constructor属性默认不可枚举

ES6中的Object.getOwnPropertyNames()可以枚举到每个属性

调用区别

class必须使用new调用,不用new调用会报错。普通构造函数不用new也可以执行。

class Point {constructor(x, y) {this.x = x;this.y = y;}int() {console.log(x,y)}
}
const p = new Point()
console.log(p)
const p1 = Point()
console.log(p1)

function Point1(x, y) {this.x = x;this.y = y;
};
Point1.prototype.int = function() {console.log(x,y)
};
const pf = new Point1()
console.log(pf)
const pf1 = Point1()
console.log(pf1)

new.target属性指向当前的构造函数,不能在构造函数外部调用会报错,

function Person(name) {console.log(new.target);if (new.target !== undefined) {this.name = name;} else {throw new Error('必须使用new生成实例');}}
}

静态属性的区别

静态属性指的是 Class 本身的属性,即Class.propName,而不是定义在实例对象(this)上的属性。
class内部没有静态属性,只能在外面通过类名定义

class Foo {
}
Foo.x= 1;xx
Foo.x // 1
上面的写法为Foo类定义了一个静态属性xES6 明确规定,Class 内部只有静态方法,没有静态属性。

calss的关键字static 只能在class中使用 .定义的静态方法前加static关键字。

class Point {static x = 1;static y = 2;    static int() {console.log(this.x)}
}

class Point {constructor(){static x = 1;static y = 2;}static int() {console.log(this.x)}
}

继承区别

clas使用 extends 继承,

extends 只能用于类中的定义 不能用与普通的构造函数中

super (ES6 中的要求 :子类的构造函数必须执行一次super函数。)

super有两种用法
1.直接当成函数调用,表示父类的构造
如果定义了constructor 并表示这个是子类,则必须在constructor的第一行手动调用父类的构造函数.
如果说子类不写constructor,则会有默认的构造器,自动去调用父类的构造器

 class Animal{constructor(type,name,age,sex){this.type = type;this.name = name;this.age = age;this.sex = sex;}print(){console.log(`种类 : ${this.type}`)console.log(`名字 : ${this.name}`)console.log(`年龄 : ${this.age}`)console.log(`性别 : ${this.sex}`)}}class Dog extends Animal{constructor(name,age,sex){super("犬类",name,age,sex)}}const d = new Dog("旺财",5,"公");console.log(d);d.print();

2.super如果说当成对象使用,则表示父类的原型
super.inti() 这表示调用父类的inti方法

 class Dog extends Animal{print(){   //super.print();}}const d = new Dog("旺财",5,"公");console.log(d);d.print();//和普通构造函数一样父类和自身都拥有相同的属性名优先使用自身的

语言模式区别

类总是使用严格模式的。这意味着类构造中的所有代码都自动处于严格模式

ES6class与ES3构造函数区别相关推荐

  1. C++赋值运算符和拷贝构造函数区别

    •由于目标对象可能引用了以前分配的数据,所以函数应使用delete[]来释放这些数据. •函数应当避免将对象赋给自身:否则给对象重新赋值前,释放内存操作可能删除对象的内容. •函数返回一个指向调用对象 ...

  2. [转载] 深层复制构造函数和浅层复制构造函数区别

    参考链接: Python复制(深层复制和浅层复制) 构造函数用来初始化对象的,复制构造函数是把一个已知的对象复制给新的对象,(2者都是对象). 浅复制构造函数只复制指针(换句话说就是2个对象的地址一样 ...

  3. 什么是java构造函数_什么是java构造函数

    构造函数是面向对象中的一员,构造函数可以叫做构造器,它的函数名与类名相同,不用定义返回值类型,也没有具体的返回值.构造函数是在构建创造时对象时调用函数,作用是可以给对象进行初始化,创建对象都必须要通过 ...

  4. Java构造函数的深入理解

    我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的.那么我们在 java 里面怎么在对象一旦创建就赋值呢? public class Person {String nam ...

  5. c++ 构造函数数组_从 JS 数组操作到 V8 array.js

    前言 最近在写面试编程题,经常用到数组,经常想偷个懒,用它提供的方法,奈何还是对数组方法使用不熟练,导致写了很多的垃圾代码,很多地方稍加修改的话肯定变得简洁高效优雅? 所以✍这篇文章本着了解一下Jav ...

  6. 初探Object Pascal的类(三)

    类的构造函数 Object Pascal中的类有一种特殊的方法叫构造函数. 构造函数是一种用来建立实例类的方法. 构造函数用来初始化任何类成员变量,为类分配所必须的内存,或者做任何其他初始化工作. 在 ...

  7. C# static的用法详解

    一.静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来 ...

  8. JavaScript原型与原型链(总结篇)

    系列文章推荐 JavaScript原型与原型链(基础篇) JavaScript原型与原型链(进阶篇) JavaScript原型与原型链(总结篇) 1 构造函数和实例对象 构造函数的prototype属 ...

  9. 【C++】字符串中运算符的重载问题

    字符串中运算符的重载问题 运算符的重载: 运算符的重载实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该重载的运算符时调用此函数.这个函数叫做运算符重载函数,通常为类的成员函数. ...

  10. java静态代码块的作用域_java基础之面向对象

    0. 面向对象与面向过程的区别 面向对象 如:指挥者,人,笔记本等都可以是对象,"万物皆对象" 面向过程 如:执行者 1. 面向对象的三个特征:封装,继承,多态. 以后的开发就是: ...

最新文章

  1. 智能音箱自己把自己黑了:随机购物拨号,自主开灯关门,平均成功率达88%
  2. junit5_使用JUnit对ADF应用程序进行单元测试
  3. 学习笔记Flink(三)—— Flink安装启动与监控
  4. Livemesh文件同步功能--使用图解
  5. tiptop 编译运行_tiptop客制规范总结
  6. Objective-C中一种消息处理方法performSelector: withObject:
  7. [蓝桥杯][2019年第十届真题]后缀表达式(正解!!)
  8. 进程 zabbix_Zabbix监控在windows的进程(非进程数)
  9. 最简单的flex bison例子
  10. 数组模拟加法(每日一练 11.30)
  11. SQL Server数据库表锁定原理以及如何解除表的锁定
  12. Hadoop 集群的基准测试
  13. 上焦如雾实际上是指何项作用_广西中医药大学赛恩斯新医药学院《中医基础理论》期考试卷卷16...
  14. 如何申请微信公众平台帐号
  15. python re模块(正则表达式) sub()函数详解
  16. JAVA SE 13快速安装
  17. 微信小程序之自定义表单组件(radio)
  18. 微信小程序实现素材旋转——非canvas
  19. 聚焦AWE2020 看小家电行业“风往哪吹”
  20. 用python画月亮和星空_用canvas画一轮明月,夜空与流星

热门文章

  1. http的CA证书安装(也就是https)
  2. 【历史上的今天】9 月 3 日:谷歌发布 Android 10;微软收购诺基亚;eBay 诞生
  3. [Mac]macOS Mojave 10.14.3安装Java
  4. 市场调查大赛全保姆教程(经验分享)
  5. WIFI提示“已连接,但无法访问互联网”
  6. 被逼无奈,沉默寡言的程序员也开始露脸拍视频了
  7. 图像识别用什么神经网络,图神经网络可以做什么
  8. 如何将CHM文件翻译成中文
  9. 矩阵减法c语言程序,矩阵的加减法
  10. 如何在word中的图片上画圈标注_word图片上画圈 如何在word图片中进行画圈标示...