前端面試題積累

2021-09-13 19:19:19 字數 2901 閱讀 4661

1、工廠模式

在函式裡,new 乙個 object,然後根據傳入的引數給該物件新增屬性,最後返回該物件。問題:無法知道乙個物件的型別。

2、建構函式模式

問題:每個方法都要在每個例項上重新建立一遍。解決:在全域性作用域中定義全域性函式。當然,這會導致封裝性很差。

3、原型模式

每個函式都有乙個 prototype(原型)屬性,這個屬性是乙個指標,指向乙個物件(指向該函式的原型物件),而這個物件的用途是包含可以由特定型別的所有例項共享的屬性和方法。如果按照字面意思來理解,那麼 prototype 就是通過呼叫建構函式而建立的那個物件例項的原型物件。使用原型物件的好處是可以讓所有物件例項共享它所包含的屬性和方法。

缺點:原型中所有屬性是被很多例項共享的,這種共享對於函式非常合適。但是對於包含引用型別值的屬性問題就突出了

4、組合使用建構函式模式和原型模式

建構函式模式用於定義例項屬性,而原型模式用於定義方法和共享的屬性。

結果,每個例項都會有自己的乙份例項屬性的副本,但同時又共享著對方法的引用,最大限度地節省了記憶體。另外,這種混成模式還支援向建構函式傳遞引數;可謂是集兩種模式之長。

5、動態原型模式

在建構函式中這麼寫共享的方法和屬性:

// 方法

if (typeof this.sayname != 'function') ;

}

6、寄生建構函式模式

基本思想:建立乙個函式,該函式的作用僅僅是封裝建立物件的**,然後再返回新建立的物件。

function person(name, age, job) ;

return o;

}var friend = new person('amy', 18, 'student');

friend.sayname(); // amy

建構函式在不返回值的情況下,缺省會返回新物件例項。而通過在建構函式的末尾新增乙個 return 語句,可以重寫呼叫建構函式時返回的值。用法:這個模式可以在特殊的情況下用來為物件建立建構函式。假設我們想建立乙個具有額外方法的特殊陣列。由於不能直接修改 array 建構函式,因此可以使用這個模式。

function specialarray() ;

// 返回陣列

return values;

}var colors = new specialarray('red', 'green', 'blue');

alert(colors.topipedstring()); // red|green|blue

關於寄生建構函式模式,有一點需要說明:

首先,返回的物件與建構函式或者與建構函式的原型屬性之間沒有關係;也就是說,建構函式返回的物件與在建構函式外部建立的物件沒有什麼不同。為此,不能依賴 instanceof 操作符來確定物件型別。

所有函式都有乙個 prototype 屬性,這個屬性指向函式的原型物件

在預設情況下,所有原型物件都會自動獲得乙個 constructor (建構函式)屬性,這個屬性是乙個指向 prototype 屬性所在函式的指標

eg. person.prototype.constructor => person。

當呼叫建構函式建立乙個新例項後,該例項的內部將包含乙個指標(內部屬性[[prototype]]),指向建構函式的原型物件。注意:這個連線存在於例項與建構函式的原型物件之間,而不是存在於例項與建構函式之間。例項 => 建構函式的原型物件

判斷某個例項的原型指標是否指向某個函式的原型物件:

person.prototype.isprototypeof(person1)    // true

object.getprototypeof(person1) === person.protype // true

hasownproperty() 方法:檢測乙個屬性是存在於例項中,還是存在於原型中。只有存在於例項中時,才返回 true。

in 操作符:例項和原型中的屬性都能訪問到。

同時使用 hasownproperty() 方法和 in 操作符,就可以確定該屬性到底是存在於物件中,還是存在於原型中。

object.keys() 方法:取得物件上所有可列舉的例項屬性。

object.getownpropertynames() 方法:得到所有例項屬性(包括不可列舉屬性)。

person.prototype = :

我們將 person.prototype 設定為等於乙個以物件字面量形式建立的新物件。 最終結果相同,但有乙個例外:constructor 屬性不再指向 person 了。前面曾經介紹過,每建立乙個函式,就會同時建立它的 prototype 物件,這個物件也會自動獲得 constructor 屬性。而我們在這裡使用的語法,本質上完全重寫了預設的 prototype 物件,因此 constructor 屬性也就變成了新物件的 constructor 屬性(指向 object 建構函式),不再指向 person 函式。此時,儘管 instanceof 操作符還能返回正確的結果,但通過 constructor 已經無法確定物件的型別了。

1、原型鏈繼承

前端面試題

sprites是什麼和為什麼要使用他們?css 精靈 把一堆小的整合到一張大的上,減輕伺服器對的請求數量 有可能替代sprites的方法是什麼?svg圖示,字型圖示,字元編碼等等。1 在div排版的時候,假設現在是100px的寬,我在盒子左側用padding left留個10px的白,div就撐開了...

前端面試題

行內元素有哪些?塊級元素有哪些?空 void 元素有哪些?link和 import的區別是?常見相容性問題?含移動端 html5的離線儲存?描寫一段語義化的html 吧 html5的form如何關閉自動完成功能?什麼是閉包 closure 為什麼要用?localstorage和sessionstor...

前端面試題

朋友碰到的筆試題,在此記錄一下,並且記下碰到的有難點但是自己沒注意的到的面試題!function isnumber x else sum 2,3 5 sum 2 3 5 請寫出sum函式的具體實現。function sum a,c return a c 該題考查的是乙個以前沒接觸過的東西,叫做柯里化...