通過構造函數創建對象,在構造函數內部先創造一個空對象,再通過傳入的參數賦值,這個對象的原型會指向函數的prototype屬性。最後把這個函數內部的對象返回給要實例化的對象。
‘=’賦值操作僅僅賦的是指針,如 a.prototype = b.prototype ,它們指向的是同一個對象,當改變a.prototype的屬性的時候b.prototype的屬性也會跟着改變。但當a.prototype = {}一個新對象時,改變的是a.prototype的指向,原來的prototype對象仍存在,所以在修改之前的子類仍能訪問到原來的a.prototype,但新繼承或新new的對象和函數的原型就指向新的a.prototype
(若修改 obj.prototype = {}(新對象),已經實例化的對象的原型不會被改變,新new的會繼承新的prototype;)
方法:判斷obj的原型是否爲 Object.prototype Object.getPrototypeOf(obj) === Object.prototype;
不是所有的對象都繼承Object.prototype 如 obj = Object.create(null);
var a = obj.bind(null)沒有a.prototype屬性;
函數原型存在於函數的prototype之中所以用getPrototypeOf獲得函數的原型()中要函數的prototype 即Object.getPrototypeOf(obj.prototype);
instanceof 判斷機制,判斷右邊的prototype屬性是否出現在左邊的原型鏈上;也就規定了右邊必須是函數,函數纔有prototype屬性,左邊一般是對象,若是原始類型就會返回false
Object.create({});創建的是空對象加個空對象的原型指向的prototype;(ES5的新方法)
模擬:
if(!Object.create){
Object.create = function(proto){
function F(){}
F.prototype = proto;
return new F;
};
}
這樣也能返回一個空對象加一個空對象的原型指向的prototype屬性;
函數聲明會被前置,函數表達式變量聲明會被前置
Function構造器能拿到全局變量,但拿不到外層的局部變量(估計是Function在原型鏈上僅繼承於Object.prototype~_~!)
作爲對象方法的話,函數裏的this指向對象本身。原型鏈上的this也會指向當前對象。函數構造器中的this,若直接調用this指向window,若用new構造對象,this會指向一個空函數,並且空函數的proto會指向函數的prototype屬性,最後this會作爲返回值。
用new構造對象,若構造函數return的是基本類型,則實際返回this指向的對象,若return的是對象,就返回該對象;
bind方法作用:綁定this;科裏化;
bind 方法或函數綁定對象賦值給一個新的函數或方法名;
var a = b.bind({});
bind後的函數,也就是a仍然是一個函數,若再new a(),新new的對象 bind就會被忽略;
bind的第二個參數可以綁定參數;
在for循環內的回調函數不能立即獲得i的值,因爲是for初始化之後才執行的,只有回調函數添加一個立即執行的匿名函數並傳遞i才能使回調函數獲取每次i的值,這樣回調函數獲取的就是閉包環境裏的i;
get/set方法,在對象中直接設置不能用冒號,可以get/set 函數名([參數]) {函數體} ,調用就直接 對象.函數名,set則返回右邊等號的值作爲參數
若作爲屬性標籤定義,則get/set:function([參數]){},一個屬性可以同時設置get、set
對象屬性名也要按規則取名
obj[“”]要加引號,不然只有數字和變量和對象才能使用,字母不能使用
for in遍歷的是數組下標,forEach遍歷傳遞的參數依次是:值,下標,函數,filter傳的是值,下標
JavaScript的函數在查找變量時從自身函數定義開始,從“內”向“外”查找。如果內部函數定義了與外部函數重名的變量,則內部函數的變量將“屏蔽”外部函數的變量。
減少衝突的一個方法是把自己的所有變量和函數全部綁定到一個全局變量中
ES6:let申明一個塊級作用域的變量
ES6:const定義常量,const與let都具有塊級作用域
在對象方法內部定義函數的this指向window,修復方法:在方法內加that = this,內部函數調用that
要保證this的指向正確,必須obj.xxx調用
{}.toString() 返回[object Object] function.toString()返回函數代碼
forEach,數組遍歷,只能操作,不能return;
Number類型的toString方法纔有基模式,參數表示以什麼形式輸出;
只有parseInt/parseFloat String和Number類型的時候纔有效,否則返回NaN,基模式下的參數表示當前要轉換的字符串的類型,最終都轉換成十進制的數字
isNaN(“”) //false;
parseInt/parseFloat(“”) //NaN;
Number(null) //0;
null == 0 //false
用isNaN判斷是不是數字時要除去 “” null Boolean 的情況,因爲它們都能被隱式轉換爲數字 “”用===
漢字的第一個unicode\u4e00 最後最後一個\u9fa5
理解閉包:
閉包是函數內的函數包含子函數對父函數變量的引用,當運行父函數並把父函數返回的子函數賦值給一個更上層作用域的變量,在這個作用域存在期間,只要該變量還存在並且沒被修改,這個閉包就一直存在。
function a(){
var x = 0;
var b = function(){
x+=1;
return x;
}
return b;
}
var c = a();
因爲函數b引用了函數a的變量,函數a的被引用的作用域被綁定在函數b上,函數b被返回給變量c,只要當變量c的作用域一直存在,函數b與引用函數a的活動對象組成的閉包就一直存在,
當子函數對父函數的變量進行引用時,當時父函數的被引用的變量是什麼狀態就會一直保持什麼狀態,除非子函數改變了它;
詞法作用域:當代碼寫出的時候,作用域就確定,寫在哪的作用域就在哪,不以代碼的運行爲轉移;
關聯數組(hash數組)length無效
關聯數組:
var a = [];
a[“key1”] = value1;
var b = {“key1”:value1,”key2”:value2}
在if中 0,”“,null,undefined,NaN會轉爲false;
11個內置對象,ES標準中規定的由廠商實現的對象
String Number Boolean
Array Date Math RegExp
Error
Function Object
Global(window)
js種 6種 錯誤對象:
SyntaxError: 語法錯誤
ReferenceError: 引用錯誤
TypeError: 類型錯誤,錯誤的使用了類型或類型的方法
RangeError: 範圍錯誤,特指函數的參數範圍!
EvalError: 調用eval函數時發生的調用錯誤
URLError: URL錯誤
轉義字符:當字符串與程序的特殊符號衝突時,要用轉義字符
NodeList和HTMLcollection是實時的,在迭代它們的時候還要刪除其中的元素,那就在迭代開始前生成一個靜態副本;在迭代設置條件用到NodeList和HTMLcollection的length時不應該直接使用,這會在每次迭代時都會遍歷DOM樹,重新生成NodeList和HTMLcollection,所以for(var i=0,len=nodeList.length;i