在ES6中,我們的javascript也有了類,那么,JS中的類有沒有static,public,private,protected這些關鍵字呢,又是怎么樣的呢,本文主要帶你探討JS類中的static,public,private,protected這些關鍵字的使用。
static
類(class)通過 static 關鍵字定義靜態方法。不能在類的實例上調用靜態方法,而應該通過類本身調用。這些通常是實用程序方法,例如創建或克隆對象的功能。
語法
static methodName() { ... }
描述
靜態方法調用直接在類上進行,不能在類的實例上調用。靜態方法通常用於創建實用程序函數。
調用靜態方法
從另一個靜態方法
靜態方法調用同一個類中的其他靜態方法,可使用this關鍵字。
class StaticMethodCall {
static staticMethod() {
return 'Static method has been called';
}
static anotherStaticMethod() {
return this.staticMethod() + ' from another static method';
}
}
StaticMethodCall.staticMethod();
// 'Static method has been called'
StaticMethodCall.anotherStaticMethod();
// 'Static method has been called from another static method'
從類的構造函數和其他方法
非靜態方法中,不能直接使用 this關鍵字來訪問靜態方法。而是要用類名來調用:CLASSNAME.STATIC_METHOD_NAME() ,或者用構造函數的屬性來調用該方法: this.constructor.STATIC_METHOD_NAME().
class StaticMethodCall {
constructor() {
console.log(StaticMethodCall.staticMethod());
// 'static method has been called.'
console.log(this.constructor.staticMethod());
// 'static method has been called.'
}
static staticMethod() {
return 'static method has been called.';
}
}
public
對象的成員都是public成員。任何對象都可以訪問,修改,刪除這些成員或添加新成員。主要有兩種方式來在一個新對象里放置成員:
在構造函數里
這種技術通常用來初始化public實例變量。構造函數的“this”變量用來給對象添加成員。
functin Container(param) {
this.member = param;
}
這樣,如果我們構造一個新對象var myContainer = new Container('abc'),則myContainer.member為'abc'。
在prototype里
這種技術通常用來添加public方法。當尋找一個成員並且它不在對象本身里時,則從對象的構造函數的prototype成員里找。
prototype機制用來做繼承。為了添加一個方法到構造函數創建的所有對象里,只需添加到構造函數的prototype:
Container.prototype.stamp = function (string) {
return this.member + string;
}
這樣,我們可以調用該方法myContainer.stamp('def'),結果為'abcdef'。
private
private成員由構造函數產生。普通的var變量和構造函數的參數都稱為private成員。
function Container(param) {
this.member = param;
var secret = 3;
var that = this;
}
該構造函數創建了3個private實例變量: param,secret和that。它們被添加到對象中,但是不能被外部訪問,也不能被該對象自己的 public方法訪問。它們只能由private方法訪問。private方法是構造函數的內部方法。
function People () {
this.name = "Yorhom";
var age = 16;
this.getName = function () {
return this.name
};
this.getAge = function () {
return age;
};
}
var yorhom = new People();
// undefined
alert(yorhom.age);
// 16
alert(yorhom.getAge())
例:編寫js的類,使其擁有public和private類型的屬性和方法
function People () {
this.name = "Yorhom";
var age = 16;
this.getName = function () {
return this.name
};
this.getAge = function () { //通過公有方法訪問私有屬性中的變量
return age;
};
}
var yorhom = new People();
// undefined
alert(yorhom.age);
// 16
alert(yorhom.getAge())
protected
protected可以修飾數據成員,構造方法,方法成員,不能修飾類(此處指外 部類,不考慮內部類)。被protected修飾的成員,能在定義它們的類中,同包 的類中被調用。如果有不同包的類想調用它們,那么這個類必須是定義它們的類 的子類。
//module foo:
class Foo {
constructor() {
this[Foo.PROPERTY] = 'hello';
}
test() {
console.log(this[Foo.PROPERTY]);
}
}
Foo.PROPERTY = Symbol();
export default Foo;
//module bar:
import Foo from '(module foo)';
class Bar extends Foo {
test2() {
console.log(this[Bar.PROPERTY]);
}
}
export default Bar;
//module main:
import Bar from '(module bar)';
new Bar.test2();
總結:
關鍵字 類本身 類的方法 類的實例 子類 子類方法 子類的實例
static + - - + - -
public - + + - + +
private - + - - - -
protected - + - - + -
————————————————
版權聲明:本文為CSDN博主「frontEndJie」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38045106/article/details/84666638
在有些面向對象的編程語言中,我們可以通過static關鍵詞來聲明靜態屬性,這一點,在Javascript中可以通過“模擬”的方式實現。
1、定義靜態屬性
基本語法:類名.屬性(靜態屬性)其訪問時也是通過類名.屬性進行訪問的。
特別注意:在Javascript中,Math數學類下的所有屬性和方法都是靜態的。
在Javascript中,有兩種屬性:
對象.屬性(實例屬性),屬於某個對象的屬性
類.屬性(靜態屬性),靜態屬性是所有對象公有的屬性
例1:模擬靜態屬性

例2:改進例1,實現自動計數功能

2、定義靜態方法
在實際應用中,靜態方法主要用於操作靜態屬性。定義語法:
類名.屬性 = function() {}
例3:使用靜態方法操作靜態屬性
