一般生成实例对象的方法是new一个构造函数,ES6提供了更接近面向对象语言的写法,引入了class的概念。ES6中的class可以看作语法糖,通过class关键字来定义类。

//es5 定义类 实例化时可 new 可 Point()
function Point(x, y) {
    this.x = x;
    thix.y = y;
}
Point.prototype.showPoint = function () {
    return '(' + this.x + ',' + this.y + ')';
}

//es6 定义类  实例化时必须用 new ,同时 不存在变量提升。也没有私有属性。想拥有私有属性需要变通的方式
class Point {
    //ES5 中的构造函数对应 ES6 中的构造方法
    constructor(x, y) {
        this.x = x;
        this.y = y;
        return Object.create(null);//构造方法默认返回实例对象,可不显式写明
    }

    //ES6 中定义方法时不需要加 function 关键字;同时方法之间不需要加``分号`,加了会报错
    //ES6 中类的方法全部是定义在 prototype 上的!!!
    showPoint() {
        return '(' + this.x + ',' + this.y + ')';
    }
}
//向 class 中添加方法
Object.assign(Point.prototype, {
  toString(){},
  toValue(){}
});

//test ES6 class
typeof Point;//'function'
Point ===Point.prototype.constructor;// true

//实例化 class
class B {}
let b = new B();

b.constructor === B.prototype.constructor;// true

// class 中定义的方法是不可枚举的,但是这些方法等同于全在prototype上,因此getOwnPrototypeNames有效
Object.keys(Point.prototype)
// []
Object.getOwnPropertyNames(Point.prototype)
// ["constructor","toString"]


//类的属性名,可以采用表达式
let methodName = 'getArea';
class Square {
  constructor(length) {
    // ...
  }

  [methodName]() {
    // ...
  }
}


//内容实在太多,这里给一个 数组去重的方法,慢慢体会 ES6 的博大精深吧
const s = new Set();

[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));

for (let i of s) {
  console.log(i);
}
// 2 3 5 4

非常有必要知道的判断对象类型的方法

//typeof  返回类型
typeof "John"                // 返回 string
typeof 3.14                  // 返回 number
typeof false                 // 返回 boolean
typeof [1,2,3,4]             // 返回 object
typeof {name:'John', age:34} // 返回 object
typeof undefined             // undefined
typeof null                  // object
null === undefined           // false
null == undefined            // true

//instanceof 返回布尔值
obj instanceof Object;//true 实例obj在不在Object构造函数中