天天看點

一文詳解javascript函數和面向對象程式設計

作者:黑貓程式設計

javascript函數

函數就是一個功能子產品,函數式程式設計是一種面向過程的程式設計思想,如果遇到一個大的複雜問題,可以分解成幾個部分,每個部分用專門的函數分解實作。

一文詳解javascript函數和面向對象程式設計

函數文法:

function functionName(parameters) {
  執行的代碼
}

functionName(parameters)   // 函數調用           

函數聲明後不會立即執行,會在我們需要的時候調用到。

函數提升:

  • 提升(Hoisting)是 JavaScript 預設将目前作用域提升到前面去的行為。
  • 提升(Hoisting)應用在變量的聲明與函數的聲明。

是以,函數可以在聲明之前調用:

console.log(add(3, 4));
        
function add(a, b){
    return a + b;
}           

函數表達式:JavaScript 函數可以通過一個表達式定義。

const add = function(a, b){
    return a + b;
}

console.log(add(3, 4));           

箭頭函數:表現形式更加簡潔。

const add = (a, b) => {
    return a + b;
}

console.log(add(3, 4));           

函數作用域

局部變量:隻能在函數内部通路。

變量在函數内聲明,變量為局部變量,具有局部作用域。

const output = () => {
    let a = 10;
}

console.log(a);           
一文詳解javascript函數和面向對象程式設計

變量在函數外定義,即為全局變量。

全局變量有 全局作用域: 網頁中所有腳本和函數均可使用。

let url = "https://noi.hioier.com/";

const output = () => {
    console.log(url);
}

output();           

哥德巴赫猜想

一文詳解javascript函數和面向對象程式設計

首先,将一個大問題劃分成兩個子問題:

  1. 判斷一個數是否是質數;
  2. 循環周遊2~n,如果i是質數且n-i也是質數,則輸出結果,并跳出循環。

因為枚舉過程是從小到大,第一個找到的可行解一定是字典序最小的。

let buf = "";

const is_prime = (n) => {
	for(let i = 2; i < n; i++){
		if(n % i == 0)
        	return false;
	}
    
    return true;
}

process.stdin.on("readable", function(){
    let chunk = process.stdin.read();
    if(chunk) buf += chunk.toString();
});

process.stdin.on("end", function(){
   let n = parseInt(buf);
        
   for(let i = 2; i <= n; i++){
   		if(is_prime(i) && is_prime(n - i)){
        	console.log(`${n} = ${i} + ${n-i}`);
            break;
        }
   }    
    
   // console.log(is_prime(n))

});           

面向對象程式設計

面向對象程式設計相較于面向過程程式設計更适合大型程式設計。

一文詳解javascript函數和面向對象程式設計

類是用于建立對象的模闆。我們使用 class 關鍵字來建立一個類,類體在一對大括号 {} 中,我們可以在大括号 {} 中定義類成員的位置,如方法或構造函數。

每個類中包含了一個特殊的方法 constructor(),它是類的構造函數,在建立對象時自動執行。

class People{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }

    output(){
        console.log(`My name is ${this.name}, I am ${this.age} years old.`);
    }
}

let xiaoming = new People("小明", 10);
xiaoming.output();           

繼承:

在子類的構造函數中,隻有調用super之後,才可以使用this關鍵字。

成員重名時,子類的成員會覆寫父類的成員。

class Student extends People{
    constructor(name, age, score){
        super(name, age);
        this.score = score;
    }

    output(){
        console.log(`My name is ${this.name}, I am ${this.age} years old.My total score is ${this.score}.`);
    }
}

let xiaohong = new Student("小紅", 8, 300);
xiaohong.output();           

靜态方法和靜态變量

靜态方法:在成員函數前添加static關鍵字即可。靜态方法不會被類的執行個體繼承,隻能通過類來調用。

class People{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }

    output(){
        console.log(`My name is ${this.name}, I am ${this.age} years old.`);
    }

    static current_class_name(){
        console.log("People");
    }
}

let xiaoming = new People("小明", 10);
// xiaoming.output();
// xiaoming.current_class_name();
People.current_class_name();           

靜态變量:隻能通過classname.variablename定義和通路。

class People{

    constructor(name, age){
        this.name = name;
        this.age = age;
        People.color = 'yellow';
    }

    output(){
        console.log(`My name is ${this.name}, I am ${this.age} years old.`);
    }

    static current_class_name(){
        console.log("People");
    }
}

console.log(People.color);           

相關推薦

  • Javascript簡介和基礎資料類型
  • Javascript對象和頁籤實作
  • 一文詳解javascript輪播圖
  • 一文詳解Javascript定時器
  • Javascript點選按鈕控制圖檔切換
  • 一文詳解Javascript滑鼠事件,拖拽原理
  • 一文詳解Javascript正規表達式,檢測使用者名密碼合法性
  • Javascript擷取className屬性和slice切片

視訊講解

視訊加載中...

繼續閱讀