美文网首页
JS面试2--原型

JS面试2--原型

作者: 写给我的公主的简书 | 来源:发表于2019-04-09 10:35 被阅读0次

    原型

    1. 所有的引用类型(对象、数组、函数)都可以随意扩展属性(null除外)
    var a =  {};
    a.a=1
    a.b='abc'
    a.c=function(){}
    
    1. 所有的引用类型都有一个__proto__(隐式原型)属性
    var a =  {};
    console.log(a.__proto__)
    
    1. 所有的函数都有一个prototype(显示原型)属性
    var foo =  function(){};
    console.log(foo.prototype)
    

    4.所有的引用类型(数组、对象、函数),__proto__属性指向其构造函数的prototype属性值

    console.log(a.__proto__ === Object.prototype)
    

    5.当获取对象的属性时,如果对象本身没有这个属性,就会去它的__proto__(即它的构造函数的prototype)中寻找

    function Foo(name){
      this.name = name;
    }
    Foo.prototype.sayName = function(){
      alert(this.name);
    }
    var foo = new Foo('zhangsan');
    foo.sayName();
    

    补充:

    1.遍历对象自身属性

    function bianli(f){
        var item;
        var list = [];
        for(item in f){
            if(f.hasOwnProperty(item)){
                list.push(item);
            }
        }
        return list;
    }
    

    原型链

    function Foo(name){
      this.name = name;
    }
    Foo.prototype.sayName = function(){
      alert(this.name);
    }
    var foo = new Foo('zhangsan');
    foo.sayName();
    /*
        * foo的__proto__中并不存在toString()
        * 由于foo.__proto__实质上也是一个对象,所以会继续向它的原型上查找
        * foo.__proto__.__proto__ === Object.prototype
        * 最终在Object.prototype上找到了 toString方法
        * 也就是 foo.__proto__.__proto__上找到了toString()
    */
    foo.toString();
    
    image.png

    补充:

    1.为避免死循环

    Object.prototype.__proto__ === null
    
    image.png

    2.instanceof 是用于判断引用类型属于哪个构造方法的方法

    /*
        * 逻辑 :
        * 从foo.__proto__上能否查找到foo.__proto__===Foo.prototype
        * 找到则返回true否则false
        * 由于foo.__proto__=== Foo.prototype
        * 由于foo.__proto__.__proto__=== Object.prototype
    */
    console.log(foo instanceof Foo)   //true
    console.log(foo instanceof Object)   //true
    

    面试题

    image.png
    var f = [];
    f instanceof Array;   //true
    typeof f;   //Object  注意:无法使用typeof 判断
    
    function People(name,age){
        this.name = name;
        this.age = age;
    }
    function Man(){
        this.sex = 'Male';
    }
    
    Man.prototype = new People();
    
    var lisi = new Man();
    lisi.name = 'lisi';
    lisi.age = '18';
    console.log(lisi.name+lisi.age);
    console.log(lisi instanceof People);  //true
    
    image.png

    相关文章

      网友评论

          本文标题:JS面试2--原型

          本文链接:https://www.haomeiwen.com/subject/uuoviqtx.html