js——class基礎
阿新 • • 發佈:2018-01-31
{} 共享 poi 返回值 自身 pen tcl open type
js的類?其實還是原型!
1 class Point{ 2 constructor(x, y){ 3 this.x = x; 4 this.y = y; 5 } 6 toString(){ 7 return ‘(‘ + this.x + ‘,‘ + this.y + ‘)‘; 8 } 9 }
基本點
1. class是關鍵字,class Point定義了一個“類”。其它變量名不能與類名相同
2. Point的類型(typeof):function,必須通過new來調用
- class的pototype=>包含在class中所有定義的方法(包括constructor)
Point.protoype;//
3. 與函數一樣,類也可以使用表達式的形式定義
-
var MyPoint = class{}; var mypoint= new Mypoint();
不會變量提升:必須先定義才可以使用class
- name屬性(就像函數名),同樣的,class後的名稱只能在類內部使用
MyPoint.name;//MyPoint var MyPoint2 = class me{}; MyPoint2.name;//MyPoint2 mypoint = new me();//報錯,me未定義,只能在類內部使用
4. constructor是構造函數
- 通過new Point來實例化一個對象,且會自動調用class中的contructor
- 返回值:默認返回實例對象this,可指定其它返回值(與es5相同)
- 可省略?如果不顯式寫一個constructor,會自動添加一個空的(與C++相同)
- Point.prototype.contructor是class,而不是contructor函數
-
var point = new Point(); console.log(point.constructor===Point);//true
constructor中的this指向實例化後的對象,與es5中的相同
console.log(point);//
5. 對象屬性的定義:在constructor中用this來添加; 對象方法的定義:在class中直接定義(不加function和逗號)
6. 在class中定義的方法不可枚舉
1 Object.keys(Point.prototype);//結果為空,說明不可枚舉 2 //es5中可枚舉 3 function Test(){} 4 Test.prototype.fun1 = function(){}; 5 Object.keys(Test.prototype);//[fun1]可枚舉View Code
7. 實例對象
- 共享一個原型對象(與es5相同)
-
var p1 = new Point(); var p2 = new Point(); p1.__proto__ === p2.__proto__;//true
原型對象的方法可直接在class中添加,那如果要添加屬性呢=>getPrototypeOf / Point.prototype上添加
point.__proto__ === Point.prototype;//true var pProto = Object.getPrototypeOf(point); pProto.newAttr = 1; point.newAttr;//1
8. 靜態方法和屬性(static)
- 它們是屬於class,而不屬性實例(與C++相同)
- 靜態屬性只能在class外由類來添加
-
class StaticClass{ static constructor(){//定義一個靜態方法 console.log(this);//class{...} } constructor(){ console.log(this);//指向實例對象 } } StaticClass.attr = 1;//定義一個靜態屬性
靜態方法中的this指向的是class!
9. new的新屬性new.target
- 函數或class通過new調用,那麽在它們內部使用new.target返回自身,否則返回undefined
- 可以用於區分一個函數是否是通過new調用的
-
function Point1(){ console.log("new.target結果:", new.target); } Point1();//undefined var p = new Point1();//function Point1(){...}
在class中使用
var targetClass = class me{ constructor(){ console.log(new.target===targetClass);//true console.log(new.target===me);//true } } var tclass = new targetClass();
js——class基礎