1.什麼是面向對象?
a,萬物皆對象;
b,而同一種對象也是一個類;
c,面向對象區別於面向過程,抓住問題核心,只考慮功能和結果,而不考慮過程和內部的實行;
d,是由屬性和方法組成;
e,具有抽象,封裝,繼承,多態的特徵;
f,比如一個人是一個對象,一個機器是一個對象,一本書也是一個對象;
g,面向對象可以把程序中的關鍵模塊都視爲對象,而模塊擁有屬性及方法。這樣我們如果把一些屬性及方法封裝起來,日後使用將非常方便,也可以避免繁瑣重複的工作.
h,會使用對象的方法和屬性,不關注內部細節,也會構造對象
2.什麼是抽象?
a,把同類的對象共有的屬性或方法抽出封裝成單獨的對象,在用到的時候給相應的對象使用;
3.什麼是封裝?
a,只考慮功能和使用,不考慮內部的細節;比如;jq庫的使用;
b,隱藏對象的屬性和細節,僅對外公開接口,防止使用者對內部資料的破壞;
4.什麼是繼承?
a,一個對象使用另一個對象的屬性和方法;
b,js繼承必須基於對象來繼承;
c,有兩種繼承方式:1,對象冒充,優點是可以實現多重繼承,初始化 繼承自父類的參數;缺點是浪費內存資源,所有的實例都會有一份成員方法的副本;2.原型方式,
5.什麼是多態?
a,同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。
b,引用類型在不同情況下的多種狀態;
c,比如“+”,在字符串中是鏈接符號,在數字間是加號;
d,有3中最常見的方式:—1.重載(重載是指多個同名但參數不同的方法,這個JavaScript確實沒有,但是我們可以繞個大彎來實現,根據arguments來判斷參數個數和類型,然後再函數體中分情況執行不同的代碼。)—2.重寫(重寫指子類重新定義父類方法,這正好就是基於prototype繼承的玩法);—3.接口;
6.構造函數存在問題?
a,沒有new,類名沒有大寫;
b,看似代碼被封裝,但其實調用的是另一個代碼塊,浪費內存;
7.this詳解
a,this指的是,調用函數的那個對象。
b,代表函數運行時,自動生成的一個內部對象,只能在函數內部使用
分四種情況詳解this
1.情況一:純粹的函數調用
這是函數的最通常用法,屬於全局性調用,因此this就代表全局對象Global
請看下面這段代碼,它的運行結果是1。
function test(){
this.x = 1;
alert(this.x);
}
test(); // 1
爲了證明this就是全局對象,我對代碼做一些改變,但結果還是1
var x = 1;
function test(){
alert(this.x);
}
test(); // 1
情況二:作爲對象方法的調用
函數還可以作爲某個對象的方法調用,這時this就指這個上級對象。
function test(){
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1
情況三 作爲構造函數調用
所謂構造函數,就是通過這個函數生成一個新對象(object)。這時,this就指這個新對象。
運行結果爲1。爲了表明這時this不是全局對象,我對代碼做一些改變:
function test(){
this.x = 1;
}
var o = new test();
alert(o.x); // 1
運行結果爲2,表明全局變量x的值根本沒變。
var x = 2;
function test(){
this.x = 1;
}
var o = new test();
alert(x); //2
情況四 apply調用
apply()是函數對象的一個方法,它的作用是改變函數的調用對象,它的第一個參數就表示改變後的調用這個函數的對象。因此,this指的就是這第一個參數。
apply()的參數爲空時,默認調用全局對象。因此,這時的運行結果爲0,證明this指的是全局對象。
var x = 0;
function test(){
alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0
如果把最後一行代碼修改爲
o.m.apply(o); //1
運行結果就變成了1,證明了這時this代表的是對象o
8.什麼是工廠模式?
a,就是在函數內創建一個對象,給對象賦予屬性及方法再將對象返回即可。
b,解決了創建多個相似對象的問題
c,缺點:工廠模式卻不能識別對象的類型,因爲全部都是Object,不像Date、Array等,因此出現了構造函數模式。
9.什麼是構造函數?
a,可以創建特定類型的對象,類似於Array、Date等原生JS的對象,
b,使用構造函數的最大的問題在於每次創建實例的時候都要重新創建一次方法(理論上每次創建對象的時候對象的屬性均不同,而對象的方法是相同的),然而創建兩次完全相同的方法是沒有必要的,因此,我們可以將函數移到對象外面。
c,就是構造對象的函數。
10.構造函數區別於工廠模式是那些點?
a,函數名首寫字母爲大寫
b,沒有顯示的創建對象
c,直接將屬性和方法賦值給了this對象
d,沒有return語句
e,使用new創建對象
f,能夠識別對象(這正是構造函數模式勝於工廠模式的地方)
11.什麼是原型?
a,我們創建的每個函數都有prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。使用原型對象的好處就是可以讓所有對象實例共享它所包含的屬性及方法。
b,原型可以用來構造屬性和方法,讓屬性和方法變成公用的代碼;內存當做節約資源,提供系統性能;
c,缺點:1.省略了構造函數傳遞初始化參數這一環節,結果所有實例在默認情況下都取得了相同的屬性值。2.由於共享,一個實例修改了引用,另一個也會隨之更改;
解決辦法:混合模式(原型模式 + 構造函數模式)
12.混合模式的好處?
a,混合模式中構造函數模式用於定義實例屬性,而原型模式用於定義方法和共享屬性。每個實例都會有自己的一份實例屬性,但同時又共享着方法,最大限度的節省了內存。另外這種模式還支持傳遞初始參數。優點甚多。這種模式在ECMAScript中是使用最廣泛、認同度最高的一種創建自定義對象的方法.
13.什麼是原型鏈?
理解一:在js中,把值分爲兩類,原始值和對象值,每個對象又有一個內部屬性原型(protetype),原型的值可以是一個對象,也可以是null,當他是對象時,那對象又有一個內部原型,這個過程就形成了一個線性的原型鏈。
理解二:在js中,一個對象所擁有的屬性不僅僅是它本身擁有的屬性,它還會從其他對象中繼承一些屬性。當js在一個對象中找不到需要的屬性時,它會到這個對象的父對象上去找,以此類推,這就構成了對象的原型鏈。
理解三:原型鏈是針對構造函數的,比如我先創建了一個函數,然後通過一個變量new了這個函數,那麼這個被new出來的函數就會繼承創建出來的那個函數的屬性,然後如果我訪問new出來的這個函數的某個屬性,但是我並沒有在這個new出來的函數中定義這個變量,那麼它就會往上(向創建出它的函數中)查找,這個查找的過程就叫做原型鏈。
原型鏈最終指向了null。