美文网首页
This 原型链 继承

This 原型链 继承

作者: Maaaax | 来源:发表于2017-12-14 12:47 被阅读0次

    this相关

    • apply call bind有什么作用,什么区别?

    语法
    fun.call(thisArg, arg1, arg2, ...)
    call()方法调用一个函数, 其具有一个指定的this值和分别提供的参数。
    可以让call()中的对象调用当前对象所拥有的function。你可以使用call()来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)。

    apply()方法与call()类似,只有一个区别,就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组。

    bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值


    • 以下代码输出什么
    var john = { 
      firstName: "John" 
    }
    function func() { 
      alert(this.firstName + ": hi!")
    }
    john.sayHi = func
    john.sayHi()       
    

    输出john:hi!,因为john.sayHi()this指向对象john

    • 下面代码输出什么,为什么
    func() 
    function func() { 
      alert(this)
    }
    

    func()等同于window.func()所以this指向window

    • 下面代码输出什么
    document.addEventListener('click', function(e){
        console.log(this);    // 此处this指的是绑定事件的对象,即document
        setTimeout(function(){
            console.log(this);  //setTimeout定时器中的this默认是window,所以此处this为window
        }, 200);
    }, false);
    
    • 下面代码输出什么
    var john = { 
      firstName: "John" 
    }
    
    function func() { 
      alert( this.firstName )
    }
    func.call(john)  //输出  john,因为call()方法将传入的john对象作为this
    
    • 以下代码有什么问题,如何修改
    var module= {
      bind: function(){
        $btn.on('click', function(){
          console.log(this) //this指什么
          this.showMsg();
        })
      },
      
      showMsg: function(){
        console.log('饥人谷');
      }
    }
    //   上述代码中的this代表绑定事件的$btn元素,而$btn是没有showMsg()的,
    //   修改方法:将this重新定义,使方法有效↓
    var module= {
      bind: function(){
        $btn.on('click', function(){
          console.log(this) //this指什么
          this.showMsg();
        }.bind(this))
      },
      
      showMsg: function(){
        console.log('饥人谷');
      }
    }
    

    原型链相关

    • 有如下代码,解释Person、 prototype、_proto_、p、constructor之间的关联
    function Person(name){
        this.name = name;
    }
    Person.prototype.sayName = function(){
        console.log('My name is :' + this.name);
    }
    var p = new Person("若愚")
    p.sayName();
    
    // Person 是构造函数
    // P是用Person构造函数所创建的实例
    // Person.prototype是构造函数的原型对象
    // Person.prototype.constructor === Person
    // P.__proto__ 指向Person.prototype
    // P.constructor 也指向Person构造函数
    
    • 上例中,对对象 p可以这样调用 p.toString();toString是哪里来的? 画出原型图?并解释什么是原型链。


      当对象P没有toString()时,他会在_proto_中寻找,没有的话继续沿着_proto_向上,直到在原始对象Object中找到了toString方法,由_proto_一层一层构成的链接,就叫原型链
    • 对String做扩展,实现如下方式获取字符串中频率最高的字符

    String.prototype.getMostOften = function(){
        var obj = {},max = 0, maxChar;
        for(var i = 0;i<this.length;i++){
          var char = this.charAt(i);
          if(obj[char]){
            obj[char]++;
          }else{
            obj[char] = 1;
          }
        }
        for(var key in obj){
          if(obj[key]>max){
            max = obj[key];
            maxChar = key;
          }
        }
        return maxChar;
    };
    var str = 'ahbbccdeddddfg';
    var ch = str.getMostOften();
    console.log(ch); //d
    
    • instanceOf有什么作用?内部逻辑是如何实现的?

    instanceOf 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性

    使用instanceOf会沿着对象的原型链去寻找constructor属性,来判断是否指向某个构造函数,返回true OR false

    继承相关

    • 继承有什么作用?
      继承可以使一个对象使用另一个对象的属性和方法
    • 下面两种写法有什么区别?
    //方法1
    function People(name, sex){
        this.name = name;
        this.sex = sex;
        this.printName = function(){
            console.log(this.name);
        }
    }
    var p1 = new People('饥人谷', 2)
    
    //方法2
    function Person(name, sex){
        this.name = name;
        this.sex = sex;
    }
    
    Person.prototype.printName = function(){
        console.log(this.name);
    }
    var p1 = new Person('若愚', 27);
    

    用第一种构造函数所创建的实例所使用的printName方法是独立的,单独储存的,占用资源较大
    第二种将printName方法写到prototype中,使所有创建的实例能够共享此方法,节省内存,提高性能

    • Object.create 有什么作用?兼容性如何?

    Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象

    可用于实现原型属性、方法的继承
    兼容:
    chrome 5,Edge,Firefox 4,IE 9,Opera 11.6,Safari 5

    • hasOwnProperty有什么作用? 如何使用?

    作用:hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性
    语法:obj.hasOwnProperty(prop)

    • 如下代码中call的作用是什么?
    function Person(name, sex){
        this.name = name;
        this.sex = sex;
    }
    function Male(name, sex, age){
        Person.call(this, name, sex);    //这里的 call 有什么作用
        this.age = age;
    }
    

    再Male构造函数中通过call()方法引入person函数,可以使用Person的属性、方法,实现了继承

    • **补全代码,实现继承 **
    function Person(name, sex){
        this.name = name;
        this.sex = sex;
    }
    
    Person.prototype.getName = function(){
          return this.name;
    };    
    Person.prototype.printName = function(){
          console.log(this.name);
    }; 
    function Male(name, sex, age){
        this.age = age;
        Person.call(this,name, sex)
    }
    
    Male.prototype = Object.create(Person.prototype)
    Male.prototype.constructor = Male
     
    Male.prototype.getAge = function(){
        console.log(this.age);
    };
    
    var ruoyu = new Male('若愚', '男', 27);
    ruoyu.printName();
    

    相关文章

      网友评论

          本文标题:This 原型链 继承

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