博客列表 >【JS】JS 之构造函数与类--重点总结

【JS】JS 之构造函数与类--重点总结

可乐随笔
可乐随笔原创
2022年11月30日 23:28:05851浏览

JS 构造函数与类

一、构造函数

JS 没有“类”(class),通过“构造函数”来实现
JS 是基于“原型继承”实现面对对象编程

1.类中成员

    1. 属性:实例(对象):声明在构造方法中
    1. 方法:实例共享:声明在原型(prototype)
    1. 静态:函数(类)访问:直接挂载到构造方法中
  1. const fn = function () { }
  2. console.log(typeof fn)
  3. //instanceof:判断某个对象是否是某个类的实例
  4. console.log(fn instanceof Object)
  5. //true ,函数也是对象,是对象的一种
  6. fn.site = 'php.cn'
  7. fn.hello = function () {
  8. return 'Hello ' + this.site
  9. }
  10. console.log(fn.site)
  11. console.log(fn.hello())
  12. console.log('------------------')
  13. //任何函数都有一个“原型”属性,是一个对象{}
  14. console.log(fn.prototype, typeof fn.prototype)
  15. //JS是基于原型实现继承,所以原型对象上的成员可以被所有类实例共享
  16. console.log('------------------')

2. 构造函数

专用于创建对象(实例)

声明

1.函数名首字母应该大写(大驼峰):行为规范请遵守
2.禁止用箭头函数声明:箭头函数没有自己的this

  1. let User = function (uname, email) {
  2. //创建新对象,JS自动完成
  3. //let this = new User()
  4. //添加新对象
  5. //(1)属性
  6. this.uname = uname
  7. this.email = email
  8. //返回this,JS自动完成
  9. //return this
  10. }
  11. // (2) 方法,应该被所有对象所共享,prototype
  12. User.prototype.say = function () {
  13. return `${this.uname}:${this.email}`
  14. }
  15. //(3)静态成员
  16. User.nation = 'CHINA'

调用

  1. //new:控制函数内部的this指向,指向当前对象,否则全局
  2. const user = new User('老马', 'nx99@qq.com')
  3. // 1. 访问属性
  4. console.log(user.uname, user.email)
  5. console.table(user)
  6. // 2. 访问方法
  7. /**
  8. * * 原型属性(prototype)
  9. * * 任何函数都有原型属性:`prototype`
  10. * * 原型属性仍然是一个对象
  11. * * 声明在原型中的成员,被全部实例共享
  12. */
  13. console.log(user.say())
  14. //new class
  15. const user1 = new User('admin', 'admin@qq.com')
  16. console.log(user1.say())
  17. // 3. 访问静态成员,不需要实例化
  18. console.log(User.nation)

3. 通过“原型属性”实现继承

  1. //子类,它是User类的子类
  2. //这里的: “类” === “构造函数”
  3. //SEX是子类独有的,扩展了父类功能
  4. const Child = function (uname, email, sex) {
  5. //继承父类
  6. return new User(uname, email)
  7. }
  8. //当前类继承了User
  9. Child.prototype = User.prototype
  10. const child = new Child('小龙女', 'xln@qq.com')
  11. console.table(child)
  12. console.log(child.say())

二、class类

1.类声明

  1. let User = class {
  2. //构造函数:(1)声明属性
  3. constructor(uname, email) {
  4. this.uname = uname
  5. this.email = email
  6. }
  7. //(2)方法
  8. say() {
  9. return `${this.uname}:${this.email}`
  10. }
  11. //(3) 静态属性
  12. static nation = 'CHINA'
  13. }

2.类的实例化

  1. const user = new User('小龙女', 'xlv@qq.com')
  2. console.log(user.say())
  3. console.table(user)
  4. console.log(User.nation)
  5. console.log('---------继承----------')

3.继承

  1. class Child extends User {
  2. constructor(uname, email, sex) {
  3. //super 调用父类成员
  4. super(uname, email)
  5. //子类扩展类型
  6. this.sex = sex
  7. }
  8. say() {
  9. //super.say()调用 父类中的say()
  10. return `${super.say()},${this.sex}`
  11. }
  12. }
  13. const child = new Child('杨过', 'nx33@qq.com', '女')
  14. console.table(child)

4.在类中使用“访问器属性”

  1. console.log('---------访问器属性----------')
  2. const Stu = class {
  3. //私有属性:在属性前加 #
  4. #age = 18
  5. //访问器属性
  6. //1. 读:获取器
  7. get age() {
  8. return this.#age
  9. }
  10. //2. 写:设置器
  11. set age(age) {
  12. if (age >= 18 && age <= 100) {
  13. this.#age = age
  14. } else {
  15. console.log('年龄必须在:18-100岁之间!')
  16. }
  17. }
  18. }
  19. let stu = new Stu()
  20. console.log('age = ',stu.age)
  21. stu.age=30
  22. console.log('age = ',stu.age)
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议