HuangHongRui / Notebook

:pencil2: Yeah.. This's My NoteBook...:closed_book:
0 stars 0 forks source link

Es6_Javascript中的类 [声明] #20

Open HuangHongRui opened 7 years ago

HuangHongRui commented 7 years ago
class PersonClass { 
  constructor(name) {
    this.name = name
  }
  sayname() {
    console.log(this.name)
  }
}
let person = new PersonClass('Raine')
person.sayname() // 输出 Raine.
console.log(person instanceof PersonClass); // true
console.log(person instanceof Object); // true
console.log(typeof PersonClass); // function
console.log(typeof PersonClass.prototype.sayname); // function

类声明 是ES6中最简单的类形式.

声明一个类, 首先需要编写 class关键字, 紧跟着是 类的名字

私有属性是实例中的属性, 不会出现在原型上, 而且只能在类的构造函数或方法中创建. [上面的代码, name就是一个私有属性] 建议: 在构造函数中创建所有私有属性.从而只通过一处就可以控制类中的所以私有属性.

console.log(typeof PersonClass) 返回的是 function 所以 PersonClass 声明实际上是创建一个具有构造函数方法行为的函数.

sayname()PersonClass.prototype 上的一个方法.

与函数不同, 类属性不可被赋予新值, PersonClass.prototype 则是这样一个只可读的类属性.

HuangHongRui commented 7 years ago

类 与 自定义类型 之间的差异.

  1. 类声明 与 let 声明类似. 不能被提升, 执行声明语句之前,会一直存在临时死区中.
  2. 类声明中的AllCode将自动运行在严格模式下, 并且无法强行让代码脱离严格模式执行
  3. 在类中所有方法都不可枚举.
  4. 每一个类都有一个名为[[Construct]]的内部方法, 通过关键字 new 调用那些不含[[Construct]]的方法会导致程序抛错.
  5. 在类中修改类名会导致程序抛错 [ 可以在外部修改. ]
HuangHongRui commented 7 years ago

将PersonClass声明编写等价Code

let PersonClass = ( function() {
  "use strict"
  const PersonClass2 = function( name ) {
    if ( typeof new.target === "undefined" ) {
      throw new Error (' 必须关键字new调用 ')
    }
  this.name = name
  }
  Object.defineProperty( PersonClass2.prototype, "sayname", {
    value: function() {
      if ( typeof new.target !== "undefined" ) {
        throw new Error (" 不可通过new调用方法 ")
      }
    console.log( this.name )
  }
    enumerable: false,
    writable: true,
    configurable: true
  })
  return PersonClass2
}())