var obj = {
name: "zwb",
say: function (a, b) {
console.log(this.name, a, b)
}
}
// // obj.say()
var sky = {
name: 'xiaoli'
}
// obj.say.call(sky)
//mycall封装
Function.prototype.mycall = function (newobj, ...argu) {
var newobj = newobj || window
//获取say函数名
var fnName = Symbol(this.name)
//在新的对象挂载say方法
newobj[fnName] = this
// console.log(newobj)
//传参调用
var val = newobj[fnName](...argu)
delete newobj[fnName]
// console.log(val)
return val
}
obj.say.mycall(sky, 'nihao', 'ma')
//apply和bind
obj = {
name: 'zs',
say: function () {
console.log(this.name, ...arguments)
}
}
sky = {
name: '张杰'
}
//封装apply
Function.prototype.myapply = function (newName, argu) {
var newName = newName || window
var fnName = this.name
// console.log(fnName)
newName[fnName] = this
return newName[fnName](...argu)
delete newName[fnName]
}
obj.say.myapply(sky, [1, 2, 3])
//封装bind
Function.prototype.mybind = function (newName, ...argu) {
var newName = newName || window
that = this //先把this保存一下,后面有函数的话this指向会变
return function () {
var all_new = argu.concat(...arguments) //...arguments 还实参的集合
that.myapply(newName, all_new)
}
}
var newb = obj.say.mybind(sky, 1, 2, 3)
newb('一', '二')
call,apply,bind封装
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- call方法 首先要了解call方法,在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充...
- 我们都知道call apply bind都可以改变函数调用的this指向。那么它们三者有什么区别,什么时候该用哪个...
- 1、单对象编程:聚焦点"命名空间"的使用 2、bind()/call()/apply();的区别: (1).三者...