嗯,昨天忙了一天沒來及發,過年啊,打掃啊,什麼搽窗戶啊,拖地啊,整理柜子啊,什麼亂七八糟的都有,就是一個字,忙。 好了,廢話也不多說,把自己學到的放上來吧。嗯,說什麼好呢,就說原型鏈啊 原型對象 每個javascript對象都有一個原型對象,這個對象在不同的解釋器下的實現不同。比如在firefox下 ...
嗯,昨天忙了一天沒來及發,過年啊,打掃啊,什麼搽窗戶啊,拖地啊,整理柜子啊,什麼亂七八糟的都有,就是一個字,忙。
好了,廢話也不多說,把自己學到的放上來吧。嗯,說什麼好呢,就說原型鏈啊
原型對象
每個javascript對象都有一個原型對象,這個對象在不同的解釋器下的實現不同。比如在firefox下,每個對象都有一個隱藏的__proto__屬性,這個屬性就是“原型對象”的引用。
原型鏈
由於原型對象本身也是對象,根據上邊的定義,它也有自己的原型,而它自己的原型對象又可以有自己的原型,這樣就組成了一條鏈,這個就是原型鏈,JavaScritp引擎在訪問對象的屬性時,如果在對象本身中沒有找到,則會去原型鏈中查找,如果找到,直接返回值,如果整個鏈都遍歷且沒有找到屬性,則返回undefined.原型鏈一般實現為一個鏈表,這樣就可以按照一定的順序來查找。
怎麼講呢?直接把例子放上來講好了
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script type="text/javascript"> window.onload = function() {
/*這裡就大概瞭解一下,每一個對象都有一個原型,原型對象的方法屬性,對象都可以用*/ function foo() { this.y = 2; } foo.prototype.x = 1;/*比如這裡,定義了原型的屬性,x=1*/ var rr = new foo(); console.log(rr.y + "和" + rr.x);/*實例化後,可以直接調用原型對象的屬性,把原型看成一個類或者方法的集合就可以了*/
/*繼承*/ function person(name,sex){/*構造函數*/ this.name=name; this.sex=sex; } person.bb="我是person 上的"; person.prototype.hi=function(){ console.log(this.name+"你好"+"我是"+this.sex+"的"); } person.prototype.walk=function(){ console.log(this.name+"正在走路"); } person.prototype.a=2 function student(name,sex,like){ person.call(this,name,sex);/*我這裡用call方法來繼承*/ this.like=like; } student.prototype=Object.create(person.prototype); /*這裡用Object.create(繼承誰的?)來繼承prototype,實質是person.prototype的一個空對象賦值給student.prototype*/ student.prototype.constructor = student;/*再把名字重新定義過來*/ Object.prototype.ting = function(){ console.log(this.name+"正在聽") } student.prototype.chi = function(){ console.log(this.name+"喜歡吃"+this.like); } student.prototype.pa = function(xiezi){ console.log(this.name+"穿上"+xiezi+"奔跑"); } var kk = new student("bob","男","冰淇淋")/*new 實例化對象*/ // console.log(kk.a); // console.log(kk.hi()); console.log(kk.ting()) // console.log(typeof student.prototype);/*typeof 查看目標是什麼類型的*/ console.log(kk.pa("鞋子")); console.log(kk instanceof person.bb)/*intanceof查看右邊有沒有在左邊的原型鏈上*/ console.log(kk instanceof person) console.log(typeof kk) } </script> </body> </html>