var arr = [1,2,3];
arr.push(4);
console.log(arr);//1,2,3,4
arr.addClass('blue');
報(bào)錯(cuò)
我們可以:
arr.proto.addClass = function(){console.log('ok!!')}
arr.addClass();//ok!!
每一個(gè)!每一個(gè)函數(shù)都有prototype屬性
var fn = function(){}
fn.protoType
其中fn === fn.prototype.constructor
插一段==和===的區(qū)別
1.==
(1)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型
var a = 1;
var b = '1';
var c = true;
alert(a == b); //true
alert(a == c); //true
alert(b == c); //true
(2)一個(gè)基本數(shù)據(jù)類型與一個(gè)引用數(shù)據(jù)類型 :會(huì)將對(duì)象轉(zhuǎn)化為它的原始值新博,在與基本數(shù)據(jù)類型進(jìn)行比較。
var arr = [1,2];
var str = "1,2";
alert(arr == str); //內(nèi)部執(zhí)行valueOf(),將arr值轉(zhuǎn)化為原始值速兔,但是arr并沒有變化优俘,顯示true
將對(duì)象轉(zhuǎn)化為它的原始值龙填,也就是說后臺(tái)會(huì)自動(dòng)調(diào)用Object.prototype.valueOf()方法:var arr = [1,2];
var str = "1,2";
alert(arr.__proto__.hasOwnProperty("valueOf")); //false
alert(Object.prototype.hasOwnProperty("valueOf")); //true
Object.prototype.valueOf = function(){
alert("valueOf"); //valueOf
};
alert(arr == str); // 因?yàn)樽约簩懙膙alueOf()重新覆蓋了Object.prototype.valueOf()方法,所以不能實(shí)現(xiàn)原始值的轉(zhuǎn)化颗胡,具體請(qǐng)百度valueOf()內(nèi)部實(shí)現(xiàn)機(jī)制,所以此處顯示false
(3). 兩個(gè)引用類型:判斷兩者之間的引用地址
var arr1 = [1,2]; //引用地址1
var arr2 = [1,2]; //引用地址2
alert(arr1 == arr2); //兩者引用地址不同吩坝,顯示false
2===
相對(duì)于"=="來說杭措,只要類型不一致,它就直接返回false
不過還是建議盡量使用"==="钾恢,因?yàn)?=="不嚴(yán)謹(jǐn)手素,可能會(huì)帶來一些違反直覺的后果鸳址。比如我們常使用的對(duì)象,有時(shí)獲取不到而被賦值為undefine的情況泉懦。
var obj = undefined;
if(obj == null){
console.log("1"); //執(zhí)行
}
if(obj === null){
console.log("2"); //不執(zhí)行
}
好的稿黍,回來說prototype
所有通過函數(shù)new出來的東西都有一個(gè)proto指向這個(gè)函數(shù)的prototype
prototype(顯示原型)
proto(隱是原型)
var arr = [1,2,3]
arr.__proto__ === Array.prototype//true
var obj = {
fn1:function(){
console.log('fn1');
}
}
console.log(obj.fn1);//fn1
console.log(obj.toString);//['object' ,'object']
當(dāng)在obj中找不到方法是,它回去obj的原型里找
console.log(obj.fn2);//報(bào)錯(cuò)崩哩,無fn2方法
在obj里沒有fn2巡球,obj的原型里也沒有fn2方法
像arr.push(4)
本身arr是沒有push方法的,但是它的原型Array有啊