zoukankan      html  css  js  c++  java
  • js面试题知识点全解(一原型和原型链)

    1.如何准确判断一个变量是数组类型
    2.写一个原型链继承的例子
    3.描述new一个对象的过程
    4.zepto(或其他框架)源码中如何使用原型链
    知识点:
    1.构造函数
    2.构造函数-扩展
    3.原型规则和示例
    4.原型链
    5.instanceof

    讲解:

    构造函数:一般函数为大写字母开头的都是构造函数,如下:

    function Foo(name,age){
        this.name=name
        this.age=age
        //return this
    }
    var f = new Foo('L',20) ; //构造函数形成实例,可以创建多个对象;f是一个空对象,原型是Foo

    var a={}其实是var a=new Object()的语法糖
    var a=[]其实是var a=new Array()的语法糖
    function Foo(){}其实是var Foo=new Function()

    instanceof用于判断引用类型属于哪个构造函数的方法

    f instanceof Foo //判断f这个引用类型是否属于Foo构造函数,判断逻辑:f的_proto_一层一层往上,能否对应到Foo.prototype

    判断一个变量是否为"数组":变量名 instanceof Array,如下代码:

    var arr=[];
    arr instanceof Array //true
    typeof arr //object, typeof是无法判断是否是数组的

    原型规则和示例:

    1.所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了"null"对象以外)
    2.所有引用类型都有一个_proto_(隐式原型)属性,属性值是一个普通的对象
    3.所有函数都有一个prototype(显示原型)属性,属性值也是一个普通对象

    var obj={};
    obj.a=100;
    function fn(){}
    fn.a=100;
    
    console.log(obj._proto_); //隐式原型,都具有可扩展属性原则
    console.log(fn.prototype); //显示原型

    4.所有的引用类型,_proto_属性值指向它的构造函数的"prototype"属性值

    console.log(obj._proto_===Object.prototype) //obj的构造函数为new Object(),所以obj的隐式原型属性就指向Object的显示原型属性

    5.当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么它会去它的_proto_(即它的构造函数的prototype)中寻找

     1 //构造函数
     2 function Foo(name,age){
     3     this.name = name
     4 }
     5 Foo.prototype.alertName= function(){
     6     alert(this.name+"killua");
     7 }
     8 //创建示例
     9 var f = new Foo("L");
    10 f.lastName = function(){
    11     console.log(this.name)
    12 }
    13 f.lastName(); //"L",自身属性
    14 f.alertName(); //"Lkillua",原型属性
    15 //以上函数中,f共有3个属性,f自身的属性有2个(name属性和lastName属性),还有一个alertName是原型属性
    16 f.firstName();//这里f自身属性中没有firstName属性,它的原型Foo函数中也么有这个属性,所以要再往上一层Foo的原型上去找这个属性,这种有多层原型的函数就是原型链,直到null为止结束原型链
    17 var item;
    18 for(item in f){
    19     // 高级浏览器已经在 for in 中屏蔽了来自原型的属性,但是这里建议加上这个判断,保证程序的健壮性
    20     if(f.hasOwnProperty(item)){  //循环遍历f函数,如果f函数有它自身的属性item,则打印出item属性
    21         console.log(item)
    22     }
    23 }

    写一个原型链继承的例子:

      简单易懂的例子:

     1 function Name(){
     2     this.name=function(){
     3         console.log("killua")
     4     }
     5 }
     6 function Firstname(){
     7     this.firstname=function(){
     8         console.log("L")
     9     }
    10 }
    11 Name.prototype = new Firstname();
    12 var he = new Name();
    13 console.log(he.name); //"killua"
    14 console.log(he.firstname); //"L"

      稍复杂点的例子(建议面试用):

     1 function Elem(id){
     2     this.elem = document.getElementById(id)
     3 }
     4 Elem.prototype.html = function(val){
     5     var elem = this.elem
     6     if(val){
     7         elem.innerHTML = val
     8         return this //链式操作
     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) //addEventListener() 方法用于向指定元素添加事件句柄
    16 }
    17 var div1 = new Elem('div1')
    18 //console.log(div1.html())
    19 div1.html('<p>hello killua</p>').on('click',function(){
    20     alert('clicked')
    21 }).html('<p>javascript</p>')
  • 相关阅读:
    HDOJ 2955
    SG函数
    关于背包问题的二进制优化
    一个还算能用的调试代码
    ural 1568 Train Car Sorting 题解
    【虚拟机】:"该虚拟机似乎正在使用中。 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏。"
    解决Zookeeper报错:conf is not executed because it is not in the whitelist的解决办法
    Kali Linux更新和配置
    Docker拉取镜像时错误解决办法
    运行连接Oracle数据库时,Idea报错: Error : java 不支持发行版本5
  • 原文地址:https://www.cnblogs.com/chooper/p/7411098.html
Copyright © 2011-2022 走看看