前言:今天學(xué)習(xí)了原型和原型鏈抑堡,以下是對(duì)原型和原型鏈的一些總結(jié)。本文從下面幾個(gè)方面講解朗徊,然后在深入講解原型與原型鏈的相關(guān)知識(shí)首妖。
-全局對(duì)象
-簡(jiǎn)單類型與對(duì)象
-Number、Boolean爷恳、String有缆、Object四個(gè)對(duì)象
-(共用屬性)原型
-proto與 prototype
-燒腦的等式
全局對(duì)象Window
ECMAScript 規(guī)定全局對(duì)象叫做 global,但是瀏覽器把 window 作為全局對(duì)象(瀏覽器先存在的)
注:
1.window對(duì)象中的所有方法都可以省去window温亲,alert()方法可以寫成window.alert()棚壁,或者省去window,直接寫做alert()
2.瀏覽器自己加的屬性栈虚,因?yàn)闆]有標(biāo)準(zhǔn)灌曙,所以瀏覽器上呈現(xiàn)的效果是不一樣的
簡(jiǎn)單類型與對(duì)象
//聲明簡(jiǎn)單的數(shù)據(jù)類型
var n1 = 1;
//聲明一個(gè)對(duì)象,可以用n2.toString()將其轉(zhuǎn)換成字符串
var n2 = new Number(1);
這兩種方法都可以創(chuàng)建一個(gè)變量节芥,區(qū)別就在于所占的內(nèi)存空間的不同
想要在n1上使用toString方法也是可以的并且返回"1"
這其實(shí)是引用了一個(gè)臨時(shí)的函數(shù)temp,只不過用完之后就把他抹除了
var n1 =1
var temp = new Number(1);
n1 = temp.toString();
下面是一道題目
var n = 1
n.xxx = 2
n.xxx=?//undefined
解題思路如下
Number對(duì)象
Number的常用屬性
如:
var n2 = new Number(1);
n2.toString(); //"1"
n2.valueOf(); //1
n2.toFixed(2); //"1.00"
n2.toExponential(); //"1e+0"
注:number類型的的toString方法可以加參數(shù)逆害,表示按照什么進(jìn)制來解析(不加參數(shù)默認(rèn)按十進(jìn)制解析)头镊,如:
(100).toString(16); //"64"
(100).toString(2); //"1100100"
String對(duì)象
String的常用屬性
如:
var s = new String('hello World');
//獲取字符串中某一位的字符
s.charAt(1) ; //"e"
//獲取字符串中某一位的字符的Unicode編碼
s.charCodeAt(0); //104
//刪除字符串中多余的空格,是左右兩面的空格
s.trim(); //"hello World"
//連接字符串1和字符串2,字符串1和字符串2是沒有被改變的
var s1 = "hello";
var s2 = " world";
s1.concat(s2); //"hello world"
console.log(s1); //"hello"
console.log(s2); //" world"
//切片,截取字符串(包前不包后)魄幕,從start到end
s.slice(0,2); //"he"
//將字符串中的e替換成o(只能替換第一次出現(xiàn)的字符)
s.replace('e','o'); //"hollo World"
//搜索字符串中的內(nèi)容(只檢測(cè)到第一次出現(xiàn)的字符)相艇,沒搜到返回-1
s.indexOf('s') //-1
//根據(jù)字符串中間的空格分隔字符串,變成數(shù)組
s.split(); //["hello World"]
//返回一個(gè)字符串中從指定位置開始到指定字符數(shù)的字符
s.substr(0); //"hello World"
s.substr(0,5); //"hello"
Boolean對(duì)象
介紹一個(gè)兩種不同的賦值方法下容易出錯(cuò)的地方纯陨。
var f1 = false;
var f2 = new Boolean(false);
if(f1) { console.log('1') } ;
if(f2) { console.log('2') } ;
注:
f1和f2的值都是false坛芽,但是f2是對(duì)象,一切對(duì)象(不論是否是空對(duì)象)都是truey翼抠,所以使用if判斷語句咙轩,會(huì)將f2轉(zhuǎn)化為了true,打印出2
Object對(duì)象
Object對(duì)象阴颖,兩種賦值方法是一樣的活喊,沒有任何區(qū)別。
注:
var obj1 = {};
var obj2 = {};
obj1 === obj2; // false
為什么obj1不恒等于obj2量愧?同樣都是空獨(dú)享钾菊,但是它們?cè)趕tack棧內(nèi)存中存儲(chǔ)的內(nèi)容是heap堆內(nèi)存中的地址帅矗,每個(gè)對(duì)象的內(nèi)容在heap內(nèi)存中的地址是不會(huì)一樣的,所以對(duì)象與對(duì)象一般都是不相等的煞烫。(除非你將一個(gè)對(duì)象的內(nèi)存地址復(fù)制給另一個(gè)對(duì)象)
原型與原型鏈
原型
所有對(duì)象都有 toString 和 valueOf 屬性浑此,那么我們是否有必要給每個(gè)對(duì)象一個(gè) toString 和 valueOf 呢?可以但是沒必要滞详。因?yàn)镴S每次聲明一個(gè)對(duì)象都要寫一次這些方法這樣寫的話會(huì)非常占用內(nèi)存凛俱,所以JS 的做法是把所有的對(duì)象共用的屬性全部放在heap堆內(nèi)存的一個(gè)對(duì)象(共用屬性組成的對(duì)象),然后讓每一個(gè)對(duì)象的 __proto__存儲(chǔ)這個(gè)「共用屬性組成的對(duì)象」的地址茵宪。而這個(gè)共用屬性最冰,就是傳說中的原型。
原型的目的:可以減少不必要的內(nèi)存浪費(fèi)
下面用一張圖來解釋對(duì)象使用函數(shù)來進(jìn)行進(jìn)行創(chuàng)建的方法
其中創(chuàng)建這個(gè)字符串所連成的鏈就是原型鏈稀火。
我們創(chuàng)建的對(duì)象的proto 會(huì)用來指向原有的String對(duì)象暖哨,使得我們可以調(diào)用String對(duì)象的公有屬性。
總結(jié):
proto是某對(duì)象的共用屬性的引用凰狞,是為了用戶使用其共用屬性中的方法而存在的 篇裁。(使用的)
prototype 是瀏覽器寫的,本身就存在赡若,是某對(duì)象的共同屬性的引用达布,為了不讓對(duì)象的共用屬性因沒有被調(diào)用而被垃圾回收而存在。(防止回收)
燒腦的等式
其實(shí)萬變不離其宗
var 對(duì)象 = new 函數(shù)()
對(duì)象.__proto__ === 函數(shù).prototype
然而JS中萬物皆可當(dāng)作對(duì)象逾冬,所以Function既是函數(shù)也是對(duì)象黍聂。