原型原型链 面试题

//测试题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);
四、原型链

相关文章
相关标签/搜索