js笔记(三)js中的this
何为this?
说起this真是让我感到深恶痛觉,我在学习js时,几个朋友一直说js作用域与作用域链是最恶心的,我差点就信了,直到this这个鬼东西出现了…
那this到底为何物呢?这个不是很好定义,但是就我的理解呢,this就是一个对象,这个对象是谁呢,要我说就是谁调用的函数,this就是谁。那问题就来了,这个谁调用的?就是个问题,代码问题还是举例说明的好:
var obj = {
fun: function () {
console.log(this)
}
}
obj.fun() // obj
上面的代码就说明了,obj.fun也就是obj调用了fun那么this就是obj喽,当然可定有小伙伴表示不服,fun就是obj的方法,this当然就是obj。。。 ,废话不多说上代码:
var obj = {
fun: function () {
console.log(this)
}
}
var fn = obj.fun
fn() // Window
what? 怎么就成了window了呢?上面这种写法是将obj.fun赋值给了fn,在fn执行时就是window.fn()
this当然是window喽。
this这个鬼,有啥用呢?
俗话说的好存在即合理,this既然存在就一定有他的作用,我总结了几点,
- 原型链编程。
嘻嘻不知道这个说法是不是我原创,但是我觉得这么说很是合适,所谓原型链编程就是在对象的原型链上写方法和属性,说起来好像高大上了呢,其实只要用过js的小伙伴都离不开原型链上的方法和属性,比如说:
var str = 'test'
str.indexOf('e')
那indexOf就是字符串原型链上的方法,那所谓原型链编程又是什么鬼呢,上例子:
var str = ' abcde '
这个时候我想写一个方法去除str的空格,通常来说就是:
function trim(s){
return s.replace(/(^\s*)|(\s*$)/g, "");
}
trim(str)
大功告成… 这样可以但是我觉得不好,咱可以利用原型链和this这样写:
String.prototype.trim = function () {
return this.replace(/(^\s*)|(\s*$)/g, "");
}
str.trim()
然后在所有字符串想去除空格时去调用这个方法就可以了,这也是面向对象的一种表现。突然有事今天写到这,闪人。。。 明天继续。