js中static靜態屬性和靜態方法,public,private,protected


在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:使用靜態方法操作靜態屬性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM