16.ES6类,对象及一些注意点

  • es6之前:没用关键字
  • es6之后:用关键字constructor, static来定义实例方法属性,静态方法,静态属性

es6之前

 /*
        1.在ES6之前如果定义一个类?
        通过构造函数来定义一个类
        */
        /*
        function Person(myName, myAge) {
            // 实例属性
            this.name = myName;
            this.age = myAge;

            // 实例方法
            this.say = function () {
                console.log(this.name, this.age);
            }
            // 静态属性
            Person.num = 666;
            // 静态方法
            Person.run = function () {
                console.log("run");
            }
        }
        // let p = new Person();
        let p = new Person("zs", 18);
        p.say();
        console.log(Person.num);
        Person.run();

es6

  • 从ES6开始系统提供了一个名称叫做class的关键字,这个关键字就是专门用于定义类的
  • Person后面没有(),可以传参数,new的时候constructor接受参数
  • 实例方法写在constructor里面,静态方法属性写在constructor外面
 class Person{
            // 当我们通过new创建对象的时候, 系统会
            //自动调用constructor
            // constructor我们称之为构造函数
            constructor(myName, myAge){
                this.name = myName;
                this.age = myAge;
            }
            // 实例属性
            // name = "lnj";
            // age = 34;
            // 实例方法
            say(){
                console.log(this.name, this.age);
            }
            // 静态属性
            static num = 666;
            // 静态方法
            static run() {
                console.log("run");
            }
        }
        // let p = new Person();
        let p = new Person("zs", 18);
        p.say();
        console.log(Person.num);
        Person.run();

注意点:

  • 构造函数里面定义实例属性,有些浏览器不支持的,要写在constructor里
    // 实例属性【这样写有些浏览器不支持的,要写在constructor】
       name = "lnj";
       age = 34;
       实例方法
  • 构造函数里面定义静态属性,一些浏览器不支持,静态方法可以。
class Person{
            // 静态属性【es6标准版不支持这样,会报错,仅静态方法ok】
            static num = 666;
            // 静态方法
            static run() {
                console.log("run");
            }
        }
         // 静态属性【这样写不会报错】
         Person.num = 666;

es6之前给原型对象添加方法属性

function Person(myName, myAge) {

            this.name = myName; // stu.name = myName;
            this.age = myAge; // stu.age = myAge;
             this.hi= function () {
                console.log("hi");
            }
            // return this;
        }
        Person.prototype.say = function () {
            console.log(this.name, this.age);
        }
         let p= new Person();
          console.log(p);
7.jpg

Person.prototype.say,say在proto

es6给原型对象添加方法属性

 class Person{
            // 当我们通过new创建对象的时候, 系统会自动调用constructor
            // constructor我们称之为构造函数
            constructor(myName, myAge){
                this.name = myName;
                this.age = myAge;
                this.hi= function(){
                console.log(this.name, this.age);
                   }
                   //都在对象上
            }
              say () {
                console.log(“k”);
                //在原型链上
             }
        }
8.png
  • 不在constructor 定义的属性方法,自动挂载在原型对象上

还有,用es6 class定义类A,如果给类添加一个原型对象,比如是obj,那么!obj内的属性方法,A的实例是找不到的!,因为在A内,不在constructor定义的方法C就自动挂载到原型对象B上,而此时已经有了原型对象obj,就是说在A内产生的原型对象B,已经没有用了!因为已经有了obj了!~,打印A的实例,在proto是看不到C方法的,并且A的实例也访问不到obj里的方法和属性,因为es6不允许。

就是说,通过es6定义的类,不能自定义原型对象,因为es6已经帮我们弄好了,比如类A内,不在constructor定义的方法C就自动挂载到原型对象B上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容