This 原型链 继承

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;imax){
        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 原型链 继承)