:
class Person {
constructor{
//構造函數,裡邊放不被繼承的私有屬性和方法
this.property1 = '第一個私有屬性';
//屬性結尾用分号
}
//不寫在constructor裡邊的屬性和方法都是寫在了prototype原型上:
Func1() {
Fun2() {
//多個方法之間不用逗号隔開,加了逗号反而是錯的
}
class PersonCild extends Person {
//extends實作繼承
報錯:
missing super() call in constructor ??//在構造函數中缺少super()調用
這個時候就是要在constructor裡邊單獨寫一行super();調用,
其他需要記憶的知識點:
類的資料類型就是函數,類本身就是函數
在類的執行個體上面調用方法,其實就是調用原型上的方法
類的原型上的constructor就是類本身
盡量不要用__proto__在執行個體對象上給類原型添加方法,應用object.getPrototypeOf
class表達式,給類命名,可以查找目前類:如下
const Myclass = class Me{
protoFun(){
return Me.name //Me
class沒有變量提升
let也沒有變量提升
類相當于執行個體的原型,所有在勒種定義的方法,都會被執行個體繼承
類(動态)方法内的this,預設執行類的執行個體
靜态方法中的this指的是類,動态方法中的this預設指的是執行個體
如果在一個方法前,加上static關鍵字,就表示該方法不會被執行個體繼承,而是直接通過類來調用,這就稱之為“靜态方法”,就是加上static後方法隻能用類的名字來調用,執行個體就調不找了
靜态方法可以與非靜态方法重名。
父類的靜态方法,可以被子類繼承。
子類 的靜态方法可以和父類的靜态方法重名,重名後在子類的靜态方法裡邊可以用super.方法名()調用父類的同名靜态方法
私有方法:隻能類内部使用,
利用Symbol的唯一性
const bar = Symbol('bar');
export default class myClass{
[bar](bar){
return '私有方法'
執行個體屬性: 定義在執行個體對象(this)上的屬性
靜态屬性: 定義在class本身的屬性
寫法:
class 類名{
this.屬性B = 屬性值;
};
類名.屬性A = 屬性值;
這裡,屬性A就是靜态屬性,定義在類的外部
class
constructor
new target 傳回new指令作用于的那個構造函數 var 執行個體 = new 函數A,則new target代表函數A
類名.name
get
set
static 靜态方法
super 代表父類的構造函數 傳回父類執行個體,子類必須在constructor方法中調用super方法,因為子類執行個體的建構,基于對父類執行個體的加工
obj.getPrototypeOf(zilei) === fulei;得到子類的父類
類的__proto__和prototype屬性
es5中,__proto__指向構造函數的prototype屬性
es6中:
子類的__proto__屬性,表示構造函數的繼承,總是指向父類
子類prototype屬性的__proto__屬性,表示方法的繼承,總是指向父類的prototype屬性
B.prototype.__proto__ = A.prototype;
B.__proto__ = A;
這兩條繼承鍊,可以這樣了解:
作為一個對象,子類(B)的原型(__proto__屬性)是父類(A);
作為一個構造函數,子類(B)的原型對象(prototype屬性)是父類的原型對象(prototype屬性)的執行個體。
執行個體的__proto__屬性
子類原型的原型,是父類的原型:子類執行個體.__proto__.__proto__ = 父類執行個體.__proto__
是以:
通過子類執行個體的__proto__.__proto__屬性,可以修改父類執行個體的行為。
原生構造函數:
是指js語言内置的構造函數,如下:
Boolean()
Number()
String()
Array()
Date()
Function()
RegExp()
Error()
Object()