Blogger Information
Blog 94
fans 0
comment 0
visits 92728
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
【JS】JS 之构造函数与类--重点总结
可乐随笔
Original
854 people have browsed it

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)
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post