美文网首页
高级-任务2

高级-任务2

作者: nicole914 | 来源:发表于2017-05-10 23:03 被阅读0次

this 相关问题

问题1: apply、call 、bind有什么作用,什么区别

function foo(a, b) {
  console.log("a:" + a + ",b:" + b + ",c:" + this.c)
}
var obj1 = {
  c: 3
}
var obj2 = {
  c: 4
}
foo.call(obj1, 1, 2)
foo.apply(obj2,[1,2])
var bar = foo.bind(obj1)
bar(1,2)

apply和call的第一个参数为调用函数式指定的this
apply的arguments每个依次列出
call的arguments是一个数组形式
call()和apply()方法会直接调用函数
bind()更常用在为回调函数指定this,bind()不会直接执行函数,而是返回一个新函数
第一个参数为调用函数式指定的this,其他参数可以在函数被调用时再写入

(!!!以下问题主要根据《你不知道的JS》中的this绑定规则回答)

问题2: 以下代码输出什么?

输出John: hi!
因为属于隐式绑定,把sayHi的this绑定到变量john上

问题3:下面代码输出什么,为什么

[object Window]
默认绑定

问题4:下面代码输出什么

#document
window
事件的this和e.currentTarget相同,即被绑定事件的元素
定时器事件的this有上下文对象,但因为没有立即执行,丢失了与上下文对象的绑定,应用默认绑定

问题5:下面代码输出什么,why

输出john
显示绑定

问题6: 以下代码有什么问题,如何修改

事件的this和e.currentTarget相同,即被绑定事件的元素$btn
应在事件绑定之前把this显示赋值给一个变量

var module= {
  bind: function(){  
    var self = this
    $btn.on('click', function(){
      console.log(this) //this指什么
      self.showMsg();
    })
  },
  
  showMsg: function(){
    console.log('饥人谷');
  }
}

原型链相关问题

问题7:有如下代码,解释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();
IMG_1164(20170510-232651).jpg

问题8: 上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。

p的方法toString继承自Object
每个对象都有一个内部链接到另一个对象,称为它的原型 prototype。该原型对象有自己的原型,等等,直到达到一个以null为原型的对象。根据定义,null没有原型,并且作为这个原型链 prototype chain中的最终链接。JS对象实现继主要是依靠原型链来实现,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。

问题9:对String做扩展,实现如下方式获取字符串中频率最高的字符

String.prototype.getMostOften = function() {
  self = this.trim()
  var countObj = {},
      max = {
        val: '',
        count: 0
      }
  for (let i = 0;i<self.length;i++) {
    if (!countObj[self[i]]) {
      countObj[self[i]] = 1
    } else {
      countObj[self[i]]++
    }
    if (countObj[self[i]] > max.count) {
      max.val = self[i]
      max.count = countObj[self[i]]
    }
  }
  return max.val
}
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch);

问题10: instanceOf有什么作用?内部逻辑是如何实现的?

instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
内部逻辑可以用以下代码表示:

 function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
  var O = R.prototype;// 取 R 的显示原型
  L = L.__proto__;// 取 L 的隐式原型
  while (true) { 
    if (L === null) 
      return false; 
    if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true 
      return true; 
    L = L.__proto__; 
  } 
 }

继承相关问题

问题11:继承有什么作用?

function Dog(name){
  this.name = name;
}
Dog.prototype = { species : '犬科' };
var dogA = new Dog('大毛');
var dogB = new Dog('二毛');
alert(dogA.species); // 犬科
alert(dogB.species); // 犬科

实例对象从原型中继承共享的方法和属性
a. 可以优化代码结构和对象关系,当需要修改共享的属性或方法时,只需修改原型里的属性或方法即可
b. 可以优化内存空间。所有实例共享的属性和方法,其实都是同一个内存地址,指向prototype对象,因此就提高了运行效率。

问题12: 下面两种写法有什么区别?

方法一:
对于每一个实例对象,printName()方法都是一模一样的内容。
每一次生成一个实例,都会产生重复的内容,浪费内存空间。
方法二:
对于每一个实例对象,其printName()方法都是同一个内存地址,即指向prototype对象,节省空间,提高运行效率。

问题13: Object.create 有什么作用?兼容性如何?

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

Object.create(proto, [ propertiesObject ])
var s = {a:1}
var w = Object.create(s)
w.__proto__ === s

ES5语法
兼容IE9+

问题14: hasOwnProperty有什么作用? 如何使用?

hasOwnProperty()方法会返回一个布尔值,指示对象是否具有指定的属性作为自身(不继承)属性。

var s = new Object()
s.propo = 'ownProp'
console.log(s.hasOwnProperty('propo'))
console.log(s.hasOwnProperty('toString'))
console.log(s.hasOwnProperty('valueOf'))

问题15:如下代码中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;
    }

使用call()方法,将Person的属性和方法绑定到Male上,即Male可以继承Person的属性和方法

问题16: 补全代码,实现继承

function Person(name, sex){
   this.name = name
   this.sex = sex
}
Person.prototype.printName = function(){
    console.log('The name is '+this.name)
};    

function Male(name, sex, age){
   Person.call(this, name, sex)
   this.age = age
}
Male.prototype = new Person()
Male.prototype.constructor = Male
Male.prototype.getAge = function(){
    console.log('The age is '+this.age)
};

var ruoyu = new Male('若愚', '男', 27);
ruoyu.printName();

相关文章

  • 高级-任务2

    this 相关问题 问题1: apply、call 、bind有什么作用,什么区别 apply和call的第一个参...

  • 高级任务2

    1、apply、call 、bind有什么作用,什么区别? apply语法--->fun.apply(thisAr...

  • 高级-任务4

    题目1: 为什么要使用模块化? 模块的由来:嵌入网页的JS代码越来越庞大,越来越像桌面程序,需要一个团队去分工协作...

  • 高级-任务5

    题目1: 如何全局安装一个 node 应用? npm install -g 题目2: package.json 有...

  • 高级-任务3

    封装一个轮播组件 封装一个曝光加载组件 封装一个 Tab 组件 封装一个 Modal 组件

  • 高级-任务1

    问题1: OOP 指什么?有哪些特性 OOP: Object Oriented programming面向对象编程...

  • 高级 - 任务5

    课程任务 题目1: 如何全局安装一个 node 应用? 在命令行使用npm install -g xxx即可以全局...

  • 高级任务2(主线任务):this_原型链_继承

    this 相关问题 问题1: apply、call 、bind有什么作用,什么区别 Function.protot...

  • Shopee虾皮运营常见问题系列【一】

    一:新入驻卖家需完成初级任务礼包和高级任务礼包! 完成2个阶段任务礼包并通过审核的卖家将会获得shopee运营经理...

  • 高级任务2:this_原型链_继承

    this 相关问题 1. apply、call 、bind有什么作用,什么区别 bind()方法创建一个新的函数,...

网友评论

      本文标题:高级-任务2

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