zoukankan      html  css  js  c++  java
  • Class类的特性(上)

    Class类的特性(上)

    ES6 的类,完全可以看作ES5构造函数的另一种写法。
    
    class Point {
      // ...
    }
    
    typeof Point // "function"
    Point === Point.prototype.constructor // true
    上面代码表明,类的数据类型就是函数,类本身就指向构造函数。
    
    构造函数的prototype属性,在 ES6 的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面。
    
    class Point {
      constructor() {
        // ...
      }
    
      toString() {
        // ...
      }
    
      toValue() {
        // ...
      }
    }
    
    // 等同于
    
    Point.prototype = {
      constructor() {},
      toString() {},
      toValue() {},
    };
    
    
    
    
    
    
    
    
    Object.assign只拷贝当前那一层的基本数据类型
    let target = {a: 123};
    let source1 = {b: 456};
    let source2 = {c: 789,data:{ff:1}};
    let obj = Object.assign(target, source1, source2);
    
    console.log(obj)  //{a: 123, b: 456, c: 789, data: {ff:1}}
    obj.data.ff       //1
    source2 .data.ff="fffffffff"
    console.log(obj)  //{a: 123, b: 456, c: 789, data: {ff:fffffffff}}
    obj.data.ff        //"fffffffff"
    
    
    类不显式定义constructor的话,引擎会自动加。
    类必须new调用,而构造函数可以直接调用。
    
    
    constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
    
    class Foo {
      constructor() {
        return Object.create(null);
      }
    }
    
    new Foo() instanceof Foo
    // false
    上面代码中,constructor函数返回一个全新的对象,结果导致实例对象不是Foo类的实例。
    
    
    与 ES5 一样,实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)。
    
    
    //定义类
    class Point {
    
      constructor(x, y) {
        this.x = x;
        this.y = y;
      }
    
      toString() {
        return '(' + this.x + ', ' + this.y + ')';
      }
    
    }
    
    var point = new Point(2, 3);
    
    point.toString() // (2, 3)
    
    point.hasOwnProperty('x') // true
    point.hasOwnProperty('y') // true
    point.hasOwnProperty('toString') // false
    point.__proto__.hasOwnProperty('toString') // true
    上面代码中,x和y都是实例对象point自身的属性(因为定义在this变量上),所以hasOwnProperty方法返回true,而toString是原型对象的属性(因为定义在Point类上),所以hasOwnProperty方法返回false。这些都与 ES5 的行为保持一致。
    
    
    
    由于本质上,ES6 的类只是 ES5 的构造函数的一层包装,所以函数的许多特性都被Class继承,包括name属性。
    name属性总是返回紧跟在class关键字后面的类名。
    
    
    
    总结:
    类中的方法能被实例继承。
    类中的this指向实例。
    
    static方法(静态方法):不能被实例调用,只能被类调用。父类中的static方法,能被子类继承。
    static方法中的this指向类。
    
    实例属性:之前一般在constructor()方法里面定义。现在直接与实例方法同级定义。(实例属性的新写法)
    
    静态属性:static prop = 1;新写法,直接在前加static。只能被类调用。
    
    私有方法和私有属性:是只能在类的内部访问的方法和属性,外部不能访问。(作用域影响)
    私有属性和私有方法:目前是提案,是前面加# 如:#a。

  • 相关阅读:
    JSON 体验JSON (二)json格式化日期
    让D2006的控件面板回到D7的样式
    突破网站限制 复制网页内容
    欢迎光临
    加密Access数据库
    取得程序中一些特殊文件夹的位置
    连接带密码的Access数据库
    我被强暴,老公这样回答是人么?(转~非黄)
    【WinCE版凯立德】2012春季版地图下载
    刚刚拍到的日环食金星凌日
  • 原文地址:https://www.cnblogs.com/wulinzi/p/10517620.html
Copyright © 2011-2022 走看看