面向對象2 ## js中已經寫好的構造函數 * 內置對象 * js提供的已經定義好的對象 * Array,Date,RegExp,String,Number,Boolean * 同時js定義好了對應的一些構造函數 * * 字元串,數字等基礎類型數據是沒有屬性和方法的。 * ??那麼我們平時創建了一個 ...
面向對象2
## js中已經寫好的構造函數
* 內置對象
* js提供的已經定義好的對象
* Array,Date,RegExp,String,Number,Boolean
* 同時js定義好了對應的一些構造函數
* * 字元串,數字等基礎類型數據是沒有屬性和方法的。
* ??那麼我們平時創建了一個字元串(非字元串對象)的時候,為什麼可以調用他length,indexOf等屬性或方法??
* 上面問題的答案就是:包裝對象
* * 包裝對象
* 當我們去調用字元串,數字,布爾值這三種基礎數據類型的屬性和方法的時候,他們本身是不具備屬性和方法的,
但是js內部,會自動的去調用他們對象的構造函數,然後把他們的值作為參數進行傳入,然後執行對應屬性或方法,並把結果進行返回
* 包裝對象一共有三個: * String,Number,Boolean
函數原型鏈
## 個人對函數原型鏈的理解
**註意__proto__這個對象在每個對象中都存在
而通過 new object()創造的對象的__proto__是沒有prototype的 為構造函數的最頂層。
首先確定一個函數為構造函數 如 function construction(){ 在構造函數創建時會創建一個空對象{},函數中的this 指向該空對象 輸出的值也為該空對象
同時構造函數中也有一個prototype對象該對象是由 var prototype=new object() ;
生成的 所以 object 為prototype的構造函數 } 通過 var fn = new construction();來調用(所謂構造函數和一般函數的區別就是用new來調用)
那麼此時的fn就為構造函數輸出的this對象指向的對象 fn.x(通過fn.x來調用x方法)判斷呢this對象中是否有x 若沒有則查看this對象中的__proto__對象中是否有這個方法
而this中的__proto__指向的是構造函數中的prototype這個對象查看prototype中是否存在這個方法 若沒有查看prototype對象中的__proto__是否存在
而構造函數中的prototype的__proto__指向的是創造prototype這個對象的js自己封裝的object()這個函數中的prototype
再在其中尋找是否存在x方法若沒有在其中的__proto__中尋找 若沒有就返回underfined;
與原型鏈有關的一些方法
hasOwnProperty() * 判斷某個屬性(方法)是否是某個對象自有的,就是非原型鏈上的 constructor
* 屬性:返回某個對象的構造函數 instanceof
* 運算符 * 判斷一個對象是否是某個構造函數的實例化對象 返回布爾值。
面向對象的繼承
我們先創建了一個構造函數,可以應用於某些元素 但我們有其他元素的應用需要在之前的構造函數上進行添加那麼我們就要用到繼承列
function Drag(element){//為原構造函數 }
function DragLimit(element) {//需要在原構造函數上進行添加的新構造函數
// 調用Drag函數,並把Drag中this指向DragLimit的this Drag.call(this, element);
//改變this指向 讓Drag函數中的this指向改變指向當前 for (var property in Drag.prototype) {在通過for in 賦值來 讓DragLimit()中的
內容等於Drag中內容 console.log(property);
// forin不只是會把Drag.prototype自身的屬性迴圈出來,還會把一些原型鏈上的屬性和方法也迴圈
出來 if (Drag.prototype.hasOwnProperty(property)) { DragLimit.prototype[property] = Drag.prototype[property]; } };
為什麼不通過賦值DragLimit.prototype = Drag.prototype;來做呢 因為在object類型中(數組 對象)若通過賦值 那麼你改變賦值的對象中的內容
原對象的內容也會被改變。 為什麼呢,解釋。 當我們在js中通過var申請並賦值時 我們會在記憶體中申請一個位置來存放 我們的var 的東西 如var a=1;
但這個a所記錄的是1這個值在記憶體中存放的位置。 當我們通過var a=[1,2,3]時在記憶體中申請一個位置存放的是數組中的1這個值所在的位置,而[]
中這些內容被存放在記憶體中的另一個地方存放1的位置中同時也記錄了[]中2存放的位置依次類推。 當我們通過varb=a 讓b=a這個數組內容時 只不過是讓b記錄
a所記錄的是1這個值在記憶體中存放的位置 並不是新開闢一個地方在存放一組數組,所以b所使用的仍然是a中的數組的所以當b數組進行修改時修改的是a中存放
的這個內容 所以a也會發生改變。