1.構造函數中有一個prototype屬性指向一個原型對象,而後原型對象中有一個constructor屬性指行構造函數,因此它們纔可以互相關聯,若是你改變了構造函數的prototype屬性所指向的原型對象如p.prototype={},那麼如今這個原型的構造函數就會變成Object,天然就調用不了以前舊的原型中的方法了,由於當前的構造函數已經和新的原型進行了關聯。 2.檢測一個對象的數據類 ◆使用Object.prototype.toString.call(arr);,方法中傳遞一個對象的實例,就可以找到它是什麼數據類型,可是這種方法沒法檢測出自動定義構造函數建立出來的對象的實例 ◆使用arr.constructor.name;也就是直接獲取這個對象的構造函數的名稱,既能夠獲取系統預約義的類型,也可以獲取到本身自定義的構造函數建立出來的對象的實例的類型的名稱,這種方式最會簡潔,很是好。 3.js繼承的三種方式 ◆給原型對象添加成員(經過對象的動態特性),可是這並非嚴格意義上的繼承 ◆直接替換掉原來的原型對象,那麼構造函數實例化的對象就可以調用新的原型對象中的方法和屬性(使用這種方式實現繼承的時候,頗有可能把以前原型中的屬性和方法清空)。 ◆利用混合的方式給原型對象添加成員,就是使用for in 外加對象的動態特性,也可以把另外一個對象全部的方法都傳給當前的對象(使用這種方式有可能會把原來原型中的同名方法或屬性覆蓋掉)。 4.擴展內置對象 ◆通常擴展對象的屬性或者方法,會使用給原型對象添加成員(對象的動態特性),可是這種方式不適合用在js 的內置對象中,由於若是改了內置對象中的成員,那麼其它地方須要用就沒辦法了,會形成衝突,因此不推薦這麼使用。 ★擴展內置對象的方式可使用以下的方式【 //新建立一個構造函數 function MyArr(){} //替換掉這個構造函數的原型(也就是讓它繼承自新的類型) MyArr.prototype=new Array();//它的原型就是一個數組了,因而它就可以調用內置對象數組中的方法 var myarr=new MyArr(); myarr.push("1個球");//調用數組的方法 myarr.push("2個球","3個球"); console.log(myarr);//["一個球","2個球","3個球"] 】,MyArr的原型變成了一個數組的實例化對象,這個數組的實例化對象並不會影響數組的原型,因此能夠隨便往裏面添加成員或修改原成員,不會影響數組對象。 5.原型鏈 ◆每一個構造函數都有原型對象 ◆每一個對象都會有構造函數 ◆每一個構造函數的原型也都是一個對象 ◆那麼這個原型對象也會有構造函數 ◆那麼這個原型對象的構造函數也會有原型對象 ◆循環往復就會造成一條鏈式結構,就稱爲原型鏈,而且到最終都會指向一個Object,Object的原型對象不存在,因此Object是最終的類型,也稱之爲基類(最終的類型) ◆對象.__proto__實際上等價於對象.constructor.prototype,也就是對象.構造函數.原型,可是最好不要動__proto__,由於會影響到構造函數的原型,這個屬性通常用來測試,由於代碼量不多,而且它並不在標準以內。 ◆當你替換掉當前構造函數的原型後要記得給這個構造函數的原型添加一個constructor屬性,否則就有可能沒法經過對象.constructor來獲取當前對象的構造函數了【 Human.prototype=new Animal();//原型繼承自Animal的一個對象 Human.prototype.constructor=Human;//可是本身仍是Human類型的 】。 6.對象的成員搜索原則 ◆當訪問一個對象的成員的時候,會先在自身中去找(由於js中有對象的動態特性,固然對象也是由構造函數建立出來的),找到了那就直接使用,若是沒有找到,那麼就會去當前對象的原型中去找,找到了仍是直接用,若是沒有找到,那麼就會去當前對象的原型對象中的原型對象中去找,就這樣一直找到最後一個原型對象(Object.prototype),若是仍是沒找到,若是你訪問的是引用類型則返回null,若是你訪問的是基本類型則返回的是undefined,你訪問的若是是一個方法,那麼就會報錯,由於null沒法被看成方法來進行調用。 7.原型繼承概念 ◆經過修改原型鏈結構來實現繼承,就叫作原型繼承 8.ECMAScript5經典繼承 ◆使用一個方法Object.create()來實現原型繼承:【 var object1={name:"zs"}; var obj=Object.create(object1); console.log(obj.name); 】 ◆兼容性寫法,由於是ECMAScript5新增的一個方法: 【 var object1={name:"zs"}; //若是這個方法存在 才調用,首先檢測瀏覽器是否有這個能力,若是沒有就手動添加一個這樣的方法,可是不推薦使用 if(Object.create){ //使用ECMAScript5中的經典繼承方式 var obj=Object.create(object1); conosle.log(obj.name); }else { //手動添加一個這樣的方法 Object.create=function(object1){ //自定義一個構造函數 function F(){} //使用原型繼承的方式 F.prototype=object1; //初始化這個構造函數 並返回 return new F(); } var obj=Object.create(object1); conosle.log(obj.name); } 】 9.Object.prototype的成員 (如下的p代指一個對象) ◆constructor:原型對象內的一個屬性,執行該原型對象相關聯的構造函數【p.constructor】。 ◆hasOwnProperty:一個方法,用來判斷對象自己(不包含原型)是否擁有某個屬性【p.hasOwnProperty("name")】。 ◆propertyIsEnumerable:判斷屬性是否屬於對象自己,判斷屬性是否能夠被遍歷【p.propertyIsEnumerable("name")】。 ◆Object.defineProperty(obj,prop,descriptor);能夠用來添加屬性,同時也能夠用來附加一些信息,例如這個屬性是否可寫可讀可遍歷 【 obj: 須要被操做的目標對象 prop: 目標對象須要定義或修改的屬性的名稱 descriptor: 將被定義或修改的屬性的描述符 var obj = new Object(); Object.defineProperty(obj, 'name', { configurable: false, writable: true, enumerable: true, value: '張三' }) console.log(obj.name) //張三 】 ◆toString()和toLocaleString():會根據操做系統來進行字符串的大小寫轉換,而且若是是日期的話還會進行地區時間的轉換。 ◆valueOf:當對象參與運算的時候,默認會先去調用對象的valueOf方法,若是valueOf獲取到的值,沒法進行運算,那麼就會去調用這個對象的toString方法,最終作的就是字符串拼接的工做了 ◆__proto__:是對象中的屬性,會指向該對象的構造函數的原型對象,能夠經過對象.__proto__去訪問原型對象。 10.Function這個構造函數,能夠用來新建函數對象 ◆var 函數名=new Function();,一個參數都不傳遞的狀況下就是建立一個空的函數。 ◆var 函數名=new Function("函數體");,只傳一個參數的狀況,這個參數就是函數體。 ◆var 函數名=new Function("參數1","參數2","函數體");,傳遞多個參數的狀況,最後一個參數爲函數體,前面的參數都是該函數的參數名。 ◆解決使用傳遞的函數體過於長的問題【 ◇可使用+做爲鏈接符號。 ◇能夠定義一個模板,而後經過dom來讀取模板中的字符串,而後將讀取到的字符串做爲函數體位置上的參數。 】 ◆解決使用傳遞的函數體過於長的問題2(ECMAScript6語法)【 //使用``來做爲字符串的界定符號 var distinct=new Function(` var arr=[]; for(var i=0;i<arguments.length;i++){ if(arr.indexOf(arguments[i])==-1){ arr.push(arguments[i]); } } `) 】 11.eval函數能夠用來將字符串轉換爲javascript代碼而且運行 ◆使用eval來解析JSON格式字符串的時候,會將{}解析爲代碼塊兒,而不是對象,因此須要在JSON格式的字符串前面拼接上var obj=,如【 var jsonData='{"name":"zs"}'; eval("var obj="+jsonData); console.log(obj);//{name:"zs"} 】。 ◆使用eval來解析JSON格式字符串的時候,會將{}解析爲代碼塊兒,而不是對ixang,因此須要在JSON格式的字符串兩邊下上小括號,如【 var jsonData='({"name":"zs"})'; var obj=eval(jsonData); console.log(obj);//{name:"zs"} 】 ◆因爲eval能夠將字符串轉換爲js代碼而且執行,因此可能會引起跨站點腳本攻擊,因此不推薦使用eval,將JSON格式字符串轉換爲js對象,可使用JSON.parse();。 12.靜態成員和實例成員的概念,是從其它變成語言中引入的 ◆靜態成員:是指構造函數的屬性和方法【 如jquery中 $.trim();$.each();.$.extends(); 】 ◆實例成員:是指實例的屬性和方法【 如$("#id").css();$("#id").text(); 】 ◆通常都是把工具方法,做爲靜態成員(全局共享,而且添加起來仍是使用的對象的動態特性,構造函數的對象均可以調用) ◆通常把跟對象相關的方法,做爲實例成員