做網(wǎng)站收入太低論文收錄網(wǎng)站排名
原型鏈和繼承
在 JavaScript 中,每個(gè)對(duì)象都有一個(gè)原型(prototype),這個(gè)原型指向另一個(gè)對(duì)象。這個(gè)鏈?zhǔn)降脑完P(guān)系被稱為原型鏈。當(dāng)訪問一個(gè)對(duì)象的屬性時(shí),如果該對(duì)象沒有該屬性,它會(huì)沿著原型鏈向上查找,直到找到該屬性或到達(dá)原型鏈的末端。
// 創(chuàng)建一個(gè)構(gòu)造函數(shù) Person
function Person(name, age) {this.name = name;this.age = age;
}// 添加一個(gè)方法到 Person.prototype
Person.prototype.greet = function() {console.log(`Hello, my name is ${this.name} and I am${this.age} years old.`);
};// 創(chuàng)建一個(gè) Person 實(shí)例
const person1 = new Person("Alice", 30);// 調(diào)用 greet 方法
person1.greet(); // Hello, my name is Alice and I am 30 years old.
繼承可以通過原型鏈實(shí)現(xiàn),也可以通過原型式繼承(如 Object.create())、組合繼承(使用原型鏈和構(gòu)造函數(shù))等方式實(shí)現(xiàn)。
作用域鏈和閉包
作用域鏈?zhǔn)?JavaScript 引擎在執(zhí)行代碼時(shí)創(chuàng)建的一個(gè)鏈?zhǔn)浇Y(jié)構(gòu),用于在函數(shù)內(nèi)部訪問變量。這個(gè)鏈從當(dāng)前函數(shù)的作用域開始,然后是外部函數(shù)的作用域,最后是全局作用域。
閉包是一個(gè)函數(shù)及其作用域內(nèi)的變量組成的組合,即使外部函數(shù)執(zhí)行完畢,閉包中的變量也不會(huì)被銷毀。
function outerFunction() {var outerVariable = "I am outer";function innerFunction() {console.log(outerVariable); // 訪問外部函數(shù)的變量}return innerFunction;
}const inner = outerFunction();
inner(); // I am outer
異步編程
回調(diào)函數(shù)是一種在異步操作完成后執(zhí)行的函數(shù)。
function fetchData(callback) {setTimeout(() => {callback("Data fetched successfully!");}, 2000);
}fetchData((data) => {console.log(data);
});
Promise 是一種對(duì)象,用于異步操作的結(jié)果。
const fetchData = () =>new Promise((resolve, reject) => {setTimeout(() => {resolve("Data fetched successfully!");}, 2000);});fetchData().then((data) => {console.log(data);}).catch((error) => {console.error(error);});
async/await 是 ES2017 引入的語(yǔ)法糖,用于處理 Promise。
async function fetchData() {try {const data = await new Promise((resolve, reject) => {setTimeout(() => {resolve("Data fetched successfully!");}, 2000);});console.log(data);} catch (error) {console.error(error);}
}fetchData();
ES6+ 新特性
- let 和 const:
let
?聲明的變量具有塊級(jí)作用域,const
?聲明的變量是常量,一旦聲明不能更改。
if (true) {let message = "Hello";console.log(message); // Hello
}const pi = 3.14159;
pi = 3; // 錯(cuò)誤,不能更改 pi 的值
- 模板字符串:使用反引號(hào)````表示,可以在字符串中嵌入變量。
const name = "Alice";
const age = 30;
const greeting = `Hello, my name is ${name} and I am${age} years old.`;
console.log(greeting); // Hello, my name is Alice and I am 30 years old.
- 箭頭函數(shù):
()=>{}
,用于簡(jiǎn)化函數(shù)聲明。
const greet = (name) => `Hello, ${name}!`;
console.log(greet("John")); // Hello, John!
- 解構(gòu)賦值:允許從數(shù)組或?qū)ο笾刑崛≈挡①x給變量。
const person = { name: "Alice", age: 30 }; const { name, age } = person; console.log(name); // Alice console.log(age); // 30
- 模塊化:通過?
import
?和?export
?語(yǔ)句來導(dǎo)入和導(dǎo)出模塊。 -
// module1.js export const add = (a, b) => a + b;// module2.js import { add } from './module1'; const result = add(5, 3); console.log(result); // 8
- 其他新特性:如?
Promise
、Set
、Map
、Proxy
、Reflect
、Symbol
?等。 -
Promise
Promise 是一個(gè)對(duì)象,用于異步操作的結(jié)果。它有三種狀態(tài):
pending
(進(jìn)行中)、fulfilled
(已完成)和?rejected
(已失敗)。const fetchData = () =>new Promise((resolve, reject) => {setTimeout(() => {resolve("Data fetched successfully!");}, 2000);});fetchData().then((data) => {console.log(data);}).catch((error) => {console.error(error);});
Set 和 Map
- Set:類似于數(shù)組,但成員的值都是唯一的,沒有重復(fù)的值。
-
const numbers = new Set([1, 2, 3, 4, 5]); console.log(numbers); // Set(5) {1, 2, 3, 4, 5}
- Map:類似于對(duì)象,但它的鍵可以是任何值,且鍵是唯一的。
-
const map = new Map([["name", "Alice"],["age", 30], ]); console.log(map); // Map(2) {name: "Alice", age: 30}
Proxy
Proxy 是一種對(duì)象,它可以攔截對(duì)象上的操作,如屬性訪問、屬性設(shè)置、函數(shù)調(diào)用等。
const person = { name: "Alice", age: 30 }; const proxy = new Proxy(person, {get: (target, key) => {if (key === "age") {return target[key] * 2; // 返回年齡的兩倍}return target[key];}, });console.log(proxy.name); // Alice console.log(proxy.age); // 60
Reflect
Reflect 是 JavaScript 語(yǔ)言的一個(gè)內(nèi)置對(duì)象,它提供了一些與 JavaScript 對(duì)象操作相關(guān)的方法。
const person = { name: "Alice", age: 30 }; const keys = Reflect.ownKeys(person); console.log(keys); // ["name", "age"]
Symbol
Symbol 是 ES6 引入的一種新的原始數(shù)據(jù)類型,表示獨(dú)一無二的值。
const symbol = Symbol("unique"); console.log(typeof symbol); // "symbol" console.log(symbol === symbol); // false
這些新特性使得 JavaScript 更加強(qiáng)大和靈活,有助于編寫更簡(jiǎn)潔、更易于維護(hù)的代碼。隨著 JavaScript 語(yǔ)言的不斷進(jìn)化,開發(fā)者需要不斷學(xué)習(xí)和適應(yīng)新的特性和變化。