一、call、apply
function fn(x, y) {
? ? ? ? ? ? console.log("hello", x, y, this)
? ? ? ? };
1.call方法
作用:調用后執行函數,可以給“this”傳參數
? ? ? ? fn.call({ a: 1 }, 1, 2,);
2.apply方法
第一個給“this”傳參數,第二個參數需要是數組形式,然后與形式參數一一對應賦值
? ? ? ? fn.apply({ a: 2 }, [9, 3, 4, 5]);
3.區別
call可以傳多個參數,apply只能傳兩個參數,一個對象一個數組
4.借用
利用傳對象的特性用call方法對可迭代對象使用數組方法
const str = "hello";let str2 = [].join.call(str, "-");console.log(str2); // h-e-l-l-o
二、函數綁定bind
1.復制函數,綁定參數
'use strict'function fn(x, y) {console.log("hello", this, x, y)}const fn2 = fn.bind({ a: 1 })const fn3 = fn.bind({ a: 1 }, 1)const fn4 = fn.bind({ a: 1 }, 1, 2)fn(1, 2); // 未進行綁定fn1(3, 4); // 綁定好了this參數,傳入的值會被賦值給x,yfn2(5); // 綁定好了this參數和x的值,傳入的值會被賦值給yfn3(); // 綁定好了this參數,x的值,y的值
2.復制join方法并綁定方法的this
const join = [].join.bind("abc");console.log(join("-")); // a-b-cconsole.log(join(",")); // a,b,cconsole.log(join(";")); // a;b;c
綁定join處理的字符串,自定義用何種方式連接字符串
三、箭頭函數
面試題:
? ? ? ? // 箭頭函數沒有局部變量“this”,this會向上層找
? ? ? ? // 箭頭函數沒有“arguments”(收集實際參數)
? ? ? ? // 不能使用new調用
四、對象配置屬性
1.屬性標志和屬性描述符
Object.getOwnPropertyDescriptor?方法允許查詢有關屬性的?完整?信息。
?Object.getOwnPropertyDescriptors(obj)?方法,一次獲取所有屬性描述符
writable
?— 如果為?true
,則值可以被修改,否則它是只可讀的。enumerable
?— 如果為?true
,則會被在循環中列出,否則不會被列出。configurable
?— 如果為?true
,則此屬性可以被刪除,這些特性也可以被修改,否則不可以。
const user = {username: "jack",age: 20,};// 對對象的一個屬性細節修改,給不存在的屬性進行修改會新增改屬性Object.defineProperty(user, "username", {value: "ll",writable: false,configurable: false,enumerable: false,})Object.defineProperty(user, "uname", {value: "llwe",writable: false,configurable: false,enumerable: false,})// 可寫性;可遍歷性;可刪除性 console.log(Object.getOwnPropertyDescriptor(user, "username")); // 一次獲取所有屬性描述符
?Object.defineProperties(obj, descriptors),允許一次定義多個屬性。
// 對當前對象進行批量修改,添加Object.defineProperties(user, {size: {value: 20,writable: false,configurable: true,enumerable: false,},hobby: {value: ["css", "html"]},});
Object.freeze(obj),禁止添加/刪除/更改屬性。為所有現有的屬性設置?configurable: false, writable: false
。
2.屬性的 getter 和 setter
有兩種類型的對象屬性。
第一種是?數據屬性。
第二種類型的屬性。?訪問器屬性。用于獲取和設置值的函數,但從外部代碼來看就像常規屬性。
get
?—— 一個沒有參數的函數,在讀取屬性時工作,set
?—— 帶有一個參數的函數,當屬性被設置時調用,
let user = {name: "John",surname: "Smith",get fullName() {return `${this.name} ${this.surname}`;},set fullName(value) {[this.name, this.surname] = value.split(" ");}
};// set fullName 將以給定值執行
user.fullName = "Alice Cooper";alert(user.name); // Alice
alert(user.surname); // Cooper
實際應用:
const user = {gender: 2,get cnGender() {const obj = { 1: "男", 2: "女" };return obj[this.gender]},set cnGender(value) {const obj = { 男: 1, 女: 2 }this.gender = obj[value];}}console.log(user.cnGender);user.cnGender = "男";console.log(user.cnGender);
當讀取cnGender時,會根據gender的值輸出cnGender;
修改cnGender時,會通過函數對應關系修改gender值,然后輸出cnGender時,會根據gender修改的值輸出cnGender。