原型原型鏈 面試題

//測試題1javascript

var A=function(){}html

A.prototype.n=1java

var b=new A()數組

A.prototype={框架

n:2,函數

m:3源碼分析

}測試

var c=new A()this

console.log(b.n,b.m,c.n,c.m)//1,undefined,2,3spa

 

//測試題2

var F=function(){};

Object.prototype.a=function(){

console.log('a()')

};

Function.prototype.b=function(){

console.log('b()')

}

var f=new F();

f.a()//a()

f.b()//報錯找不到b這個函數

F.a()//a()

F.b()//b()

若有不懂請認真分析以下(圖解):

1、題目

一、如何準確判斷一個變量是數組類型?

 

[javascript]  view plain  copy
 
  1. var array=[];  
  2. console.log(array instanceof Array);//true 判斷引用類型的具體類型要用instanceof  
  3. console.log(typeof array);//Object  

二、寫一個原型鏈繼承的的例子

 

[javascript]  view plain  copy
 
  1. //封裝一個DOM查詢實例  
  2. function Elem(id){  
  3.     this.elem=document.getElementById(id);  
  4. }  
  5. Elem.prototype.html=function(val){  
  6.     var elem=this.elem;  
  7.     if(val){  
  8.         elem.innerHTML=val;  
  9.     }else{  
  10.         return elem.innerHTML;  
  11.     }  
  12. }  
  13. Elem.prototype.on=function(type,fn){  
  14.     var elem=this.elem;  
  15.     elem.addEventListener(type,fn);  
  16.     return this;  
  17. }  
  18. var dev=new Elem('dev1');  
  19. console.log(dev.html('<p>hello world!</p>'));  
  20. dev.on('click',function(){  
  21.     alert('clicked');  
  22. })  

三、描述new一個對象的過程
(1)建立一個新對象
(2)this指向這個新對象
(3)執行代碼,即對this進行賦值

(4)返回this

 

[javascript]  view plain  copy
 
  1. //建立構造函數  
  2. function  Foo(name,age){  
  3.     //var this={};  
  4.     this.name=name;  
  5.    // return this;  
  6. }  
  7. Foo.prototype.alertName=function(){  
  8.     console.log(this.name);  
  9. }  
  10. //建立示例  
  11. var f=new Foo('zahngshan');  
  12. f.printName=function(){  
  13.     console.log(this.name);  
  14. };  
  15. //測試  
  16. f.printName();  
  17. f.alertName();  

四、zepto(或其餘框架)源碼中如何使用原型鏈
(1)閱讀源碼是高效提升技能的方式
(2)但不能‘埋頭苦鑽’有技巧在其中
(3)慕課網搜索‘zepto設計和源碼分析’
2、知識點
一、構造函數
構造函數有個特色,函數名首字母大寫,構造函數就相似於一個模板,能夠new出來多個實例
二、構造函數-擴展

(1)var a={}實際上是var a=new Object()的語法糖

(2)var a=[]實際上是var a=new Array()的語法糖

(3)function Foo(){}實際上是var Foo=new Function(...)

(4)使用instanceof判斷一個函數是不是一個變量的構造函數
三、原型規則和示例
(1)全部的引用類型(數組,對象,函數),都具備對象特徵,即自由擴展屬性(除了null之外),以下代碼所示,均可以自由擴展屬性a

 

[javascript]  view plain  copy
 
  1. var obj = {};  
  2. obj.a = 100;  
  3. var arr = [];  
  4. arr.a = 100;  
  5. function fn() {  
  6. };  
  7. var f1=new fn();  
  8. fn.a = 100;  

(2)全部的引用類型(數組,對象,函數),都有一個__proto__屬性,屬性值是一個普通的對象,以下代碼所示:

 

[javascript]  view plain  copy
 
  1. var obj = {};  
  2. obj.a = 100;  
  3. var arr = [];  
  4. arr.a = 100;  
  5. function fn() {  
  6. };  
  7. var f1=new fn();  
  8. fn.a = 100;  
  9. console.log(obj.__proto__);  
  10. console.log(arr.__proto__);  
  11. console.log(fn.__proto__);  

(3)全部的函數,都有一個prototype屬性,屬性值也是一個普通的對象

 

[javascript]  view plain  copy
 
  1. function fn() {  
  2. };  
  3. var f1=new fn();  
  4. fn.a = 100;  
  5. console.log(fn.__proto__);  
  6. console.log(fn.prototype);  

(4)全部的引用類型(數組,對象,函數),__proto__屬性值指向他的構造函數的「prototype」屬性值

 

[javascript]  view plain  copy
 
  1. var obj = {};  
  2. obj.a = 100;  
  3. var arr = [];  
  4. arr.a = 100;  
  5. function fn() {  
  6. };  
  7. var f1=new fn();  
  8. fn.a = 100;  
  9. console.log(obj.__proto__);  
  10. console.log(arr.__proto__);  
  11. console.log(fn.__proto__);  
  12. console.log(fn.prototype);  
  13. console.log(obj.__proto__ === Object.prototype);//true  
  14. console.log(fn.__proto__ === fn.prototype);//true  

(5)當試圖獲得一個對象的某個屬性時,若是這個對象自己沒有這個屬性,那麼會去它的__proto__(即它的構造函數的prototype)中尋找,即console.log(obj.__proto__ === Object.prototype);
四、原型鏈

相關文章
相關標籤/搜索