草庐IT

Class 类

5cc9c8608284 2023-03-28 原文

ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板,通过关键字class,可以定义类,基本上,ES6的class可以看成只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰, 更像买你想对象编程的语法而已
知识点:
(1)class声明类
(2)constructor定义构造函数初始化
(3)extends继承父类
(4)super调用腹肌构造方法
(5)static定义静态方法和属性
(6)父类方法可以重写
案例1:es5构造函数创建对象

      // ES5构造函数实例化对象
      function Person(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
      }
      //添加方法
      Person.prototype.sayName = function () {
        console.log(this.name);
      };
      //实例化对象
      let p = new Person("张三", 18, "male");
      console.log(p.sayName());

案例2:es6 class创建对象

    // ES6 class 创建对象
      class Person {
        //构造函数 名字不能和修改
        constructor(name, age, sex) {
          this.name = name;
          this.age = age;
          this.sex = sex;
        }
        //添加方法
        //方法必须使用该语法 不能使用es5的对象完整形式

        sayHi() {
          console.log(`我是${this.name},你好啊`);
        }
      }
      let p = new Person("lisi", 18, "female");
      console.log(p.sayHi());

静态成员

        //静态成员
        function Person() {}
        Person.name = "wangmei";
        Person.sayHi = function () {
          console.log("Hi");
        };
        let p = new Person();
        console.log(p.name); //undefined 也就是说实例身上是没有构造函数对象身上的属性的
        console.log(p.sayHi()); //Uncaught TypeError: p.sayHi is not a function 说明实例身上没有构造函数对象身上的方法的 实例和构造函数身上的属性是不相通的

构造函数身上的属性是属于函数对象的,实例对象不能访问,对于这样的属性,我们称之为静态成员,对于class而言,被static标记的成员是属于class的,而不是实例对象的,如下所示:

      class Person {
        //静态属性
        static name = "static";
        static sayHi() {
          console.log("Hi");
        }
      }
      let p = new Person();
      console.log(p.name);//undefined
      console.log(p.sayHi);//undefined

案例3:es5 实现继承

  function Person(name, age) {
        this.name = name;
        this.age = age;
      }
      //添加方法
      Person.prototype.sayHi = function () {
        console.log("Hi");
      };
      //   子类
      function Student(name, age, grade, score) {
        //通过call 让Perosn的this指向Student的实例对象 继承父类的name age属性
        Person.call(this, name, age);
        this.grade = grade;
        this.score = score;
      }
      //设置子级构造函数的原型
      Student.prototype = new Person();
      //   将子类的构造器还原
      Student.prototype.constructor = Student;

      //生命子类的方法
      Student.prototype.study = function () {
        console.log("I love study");
      };
      //实例化子类对象
      let s = new Student("danny", 2, 1, 100);
      console.log(s);

案例4:es6 类继承

    class Person {
        //构造方法
        constructor(name, age) {
          this.name = name;
          this.age = age;
        }
        //父类的方法
        sayHi() {
          console.log(`Hi,我是${this.name}`);
        }
      }
      //   子类继承自父类
      class Student extends Person {
        constructor(name, age, grade, score) {
          super(name, age);
          this.score = score;
          this.grade = grade;
          //子类的方法
        }
        study() {
          console.log("I love Studying");
        }
        eat() {
          console.log("I love eating");
        }
      }
      //实例化子类对象
      let s = new Student("lili", 12, 3, 100);
      console.log(s.name); //lili

从这两个案例可以看出,es6的类继承更简单,更切合面向对象编程,需要注意的是,如果子类中的方法父类中也定义了,那我们是无法直接调用父类的同名方法的,相当于重写了父类的方法
案例5:es6中的get和set

  //class中的get和set
      class Person {
        get name() {
          console.log("name属性被读取了");
          return "11";
        }
        set name(newVal) {
          console.log("name属性被修改了");
        }
      }
      let s = new Person();
      console.log(s.name);
      s.name = "你好";

有关Class 类的更多相关文章

  1. Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题? - 2

    假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案

  2. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

  3. ruby - 使用 Class.new 时访问外部范围 - 2

    是否有可能以某种方式访问​​Class.new范围内的a?a=5Class.new{defb;aend}.new.b#NameError:undefinedlocalvariableormethod`a'for#:0x007fa8b15e9af0>#:in`b' 最佳答案 即使@MarekLipka的回答是正确的——改变变量范围总是有风险的。这是可行的,因为每个block都带有创建它的上下文,因此您的局部变量a突然变得不那么局部了——它变成了一个“隐藏的”全局变量:a=5object=Class.new{define_method(

  4. ruby - 模块中的 instance_eval 与 class_eval - 2

    classFooincludeModule.new{class_eval"deflab;puts'm'end"}deflabsuperputs'c'endendFoo.new.lab#=>mc======================================================================classFooincludeModule.new{instance_eval"deflab;puts'm'end"}deflabsuperputs'c'endend注意这里我把class_eval改成了instance_evalFoo.new.labresc

  5. ruby-on-rails - Rails - 父类(super class)不匹配 - 2

    玩转Rails和Controller继承。我创建了一个名为AdminController的Controller,其中一个名为admin_user_controller的子类位于/app/controllers/admin/admin_user_controller.rb这是我的routes.rbnamespace:admindoresources:admin_user#Havetheadminmanagethemhere.endapp/controllers/admin/admin_user_controller.rbclassAdminUserController应用程序/Contr

  6. ruby-on-rails - ApplicationController :Class 的未定义方法 `caches_action' - 2

    我正在尝试升级到Rails4beta1,但遇到了一些问题。简而言之,这就是我的应用程序Controller的样子。classApplicationControllercaches_action在Rails4中移到了它自己的gem中,因此包含gem应该可以解决问题。gem"actionpack-action_caching",github:"rails/actionpack-action_caching"但是当我运行我的请求规范或在浏览器中访问该应用程序时,我收到此错误。app/controllers/application_controller.rb:3:in`':undefinedm

  7. ruby - 为什么在 Ruby 中一切都是 Class 的实例? - 2

    这个问题在这里已经有了答案:Rubymetaclassconfusion(4个答案)关闭7年前。我对Ruby对象模型不太了解。首先,Ruby中的一切都是Class的实例吗??这些都产生true:pObject.instance_of?(Class)pClass.instance_of?(Class)pModule.instance_of?(Class)pBasicObject.instance_of?(Class)classHello;endpHello.instance_of?(Class)我不太明白这怎么可能,如果Object是Class的父类(superclass),它怎么可能都

  8. ruby - 什么是 "Class.new"? - 2

    我不明白下面这段代码中的Sheep=Class.new部分。moduleFenceSheep=Class.newdodefspeak"Bah."endendenddefcall_sheepFence::Sheep.new.speakend它到底在做什么? 最佳答案 根据文档,Class.newCreatesanewanonymous(unnamed)classwiththegivensuperclass(orObjectifnoparameterisgiven).此外,Youcangiveaclassanamebyassigning

  9. ruby - 为什么 Object.class == Class 在 Ruby 中? - 2

    我觉得Object是每个人的祖先,包括Class。所以我觉得应该是Class.class==Object。感觉有点迷茫和扭曲 最佳答案 class返回类(#type)而不是祖先。对象的类是Class。Class的类(class)是Class。类是一个对象。广告中的真相:我从未学过Ruby,但对象类关系必须是Smalltalk30年前提出的那种关系。 关于ruby-为什么Object.class==Class在Ruby中?,我们在StackOverflow上找到一个类似的问题:

  10. ruby-on-rails - NilClass :Class 的 Rails 未定义方法 `model_name' - 2

    我有一个表单,我想出现在每个页面的顶部,所以我将它包含在/app/views/layouts/application.html.erb文件中,但我收到错误undefinedmethodmodel_name'forNilClass:Class`尝试加载页面时。这是application.html.erb中的表单片段Addnewcontact这是我的/app/controllers/user_controller.rbclassUserController我认为我遇到了这个错误,因为表单位于application.html.erb文件中,我需要以某种方式指定路径,但话又说回来,我对Rail

随机推荐