诶..朋友们好啊,我是混元形意太极门☯掌门人——马某国
刚才有个朋友问我马老师发生什么事了,我说怎么回事,给我发了几张截图
我一看!嗷!诶...有一个说是我在网吧敲代码播颈椎看坏了,马老师你能不能教教我浑元功法,诶...帮助治疗一下,我的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
}
我说小伙子你不讲武德你不懂🥶