原型原型链 面试题

//测试题1

var A=function(){}

A.prototype.n=1

var b=new A()

A.prototype={

n:2,

m:3

}

var c=new A()

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

 

//测试题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  

2、写一个原型链继承的的例子

 

[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. })  

3、描述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();  

4、zepto(或其他框架)源码中如何使用原型链
(1)阅读源码是高效提高技能的方式
(2)但不能‘埋头苦钻’有技巧在其中
(3)慕课网搜索‘zepto设计和源码分析’
二、知识点
1、构造函数
构造函数有个特点,函数名首字母大写,构造函数就类似于一个模板,可以new出来多个实例
2、构造函数-扩展

(1)var a={}其实是var a=new Object()的语法糖

(2)var a=[]其实是var a=new Array()的语法糖

(3)function Foo(){}其实是var Foo=new Function(...)

(4)使用instanceof判断一个函数是否是一个变量的构造函数
3、原型规则和示例
(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);
4、原型链

posted @ 2018-06-06 16:21  心有所属,持之以恒  阅读(1028)  评论(0编辑  收藏  举报