混元形意太极门掌门人或称JS大法好

1,132 阅读3分钟

诶..朋友们好啊,我是混元形意太极门☯掌门人——马某国

刚才有个朋友问我马老师发生什么事了,我说怎么回事,给我发了几张截图 我一看!嗷!诶...有一个说是我在网吧敲代码播颈椎看坏了,马老师你能不能教教我浑元功法,诶...帮助治疗一下,我的JS病。我说可以。😀

this

  • 默认绑定
    this默认指向window,严格模式无法进行默认绑定
    "use strict";
    function foo() {
    	console.log(this.a)
    }
    let a = 1
    foo() //TypeError: Cannot read property 'a' of undefined
    
    
  • 隐式绑定
    this指向调用它的对象
    function foo() {
       console.log(this.a)
    }
    var obj = {
     a: 1,
     foo: foo,
    }
    obj.foo() //TypeError: Cannot read property 'a' of undefined
    
  • 显示绑定
    call,apply,bind。如果把null或者undefined当做this 传入,这些值在调用时会被忽略,实际应用的是默认绑定规则
    function foo() {
      console.log(this.a)
    }
    var obj = {
      a: 1,
    }
    foo.call(obj)
    
  • new绑定
    见MDN - 创建一个新的对象,并指向这个对象

马老师总结 : 函数落脚点(调用位置)在哪个对象,就指向哪个对象。谁调用它,它就指向谁。

传统JS是讲化劲儿的,四两拨千金。二百多斤的英国大力士,都跑不起一个Hello,world…哈!😪 我说他还不服他非要跑,我说可以。诶…我一说完他啪就站起来了,很快啊❗


原型链


然后上来就是一张图,吭,一个右函数一个左对象,我全部和他解释了啊!🤬

 ps:只有对象有_proto_属性,函数有才有prototype
  • 1.图中,实例化的f1与f2的_proto_指向Foo.prototype
  • 2.Foo.prototype 也是对象,_proto_指向Object.prototype
  • 3.函数是对象,所以函数function Foo()有_proto_指向Function.prototype。
ps:我也不知道function Function()代表着什么函数
  • 4.原型链顶端就是null,所以当找不到(原型链沿着_proto_向上找)某个变量或者属性的时候报出null错误 另外:js的继承全是基于原型链,继承就是新建一个对象,复制本身 没有的,父类可访的的属性

解释出去以后自然是传统功夫以点到为止,按传统功夫的点到为止他已经输了。 我收拳的时间不打了,他突然袭击,实例来打我脸,啊,我大意了啊,没有闪🐱‍👤

new

大概就是将对象与参数传进来。新建一个对象,将新对象的原型链链到传进来的对象中

function _new(sorce, ...ary) {
  //创建一个空的简单JavaScript对象(即{ } );
  //链接该对象(设置该对象的constructor)到另一个对象 ;
  //将步骤1新创建的对象作为this的上下文 ;
  //如果该函数没有返回对象,则返回this。
  let obj = Object.create(null)
  obj._proto_ = sorce.prototype
  sorce.apply(obj, ary)
  return obj
}

call

Function.prototype._call = function (obj) {
  let arg = [] //用来函数运行的参数
  for (let i in arguments) {
    //arguments 类数组对象
    arg.push(arguments[i])
  }
  obj._fn = this //定义对象(obj)方法 指向 函数(this为运行的函数)
  return obj._fn(...arg.slice(1)) //运行对象内的函数,此时函数内的this 指向obj
  delete obj._fn //运行后删除
}

bind

Function.prototype._bind = function () {
  let arg = [].slice.call(arguments, 1) //切出除obj,拿到执行的参数
  let obj = [].slice.call(arguments)[0] //切出传入的对象,作为执行上下文的this
  let self = this
  return function () {
    //因为是外部函数调用,而外部函数又由window 调用,无对象落脚点
    //故返回的函数是 在window 环境中:我们用call 绑定到obj
    return self.apply(obj, arg)
  }
}

深copy

function deepCopy(source) {
  if (typeof source !== 'object') {
    throw new Error('error')
  }
  let obj = Object.create(null)
  for (let key in source) {
    if (source.hasOwnProperty(key)) {
      if (Object.prototype.toString.call(source[key] === '[object Object]')) {
        obj[key] = arguments.callee(source[key])
      } else {
        obj[key] = source[key]
      }
    }
  }
  return obj
}

我说小伙子你不讲武德你不懂🥶

总结

这两个年轻人不讲武德,用网上复制的代码来骗!来偷袭,我六十九岁的老同志。这好吗?!这不好 我劝!这位年轻人好自为之,好好反思,以后不要再犯这样的聪明,小聪明,啊,呃…掘金要以和为贵,要讲武德,不要搞窝里斗。