js中的this

来源:互联网 发布:linux用户忘记密码 编辑:程序博客网 时间:2024/06/05 04:08
//this//1、如果是普通方法,this指向window,准确的说是this指向null被解释到window,在ECMASCRIPT5,如果this为null,则解释成undefinedfunction t(){    this.x = 1;}console.log(window.x)  // 1//2、作为对象方法来调用,this指向该对象var obj = {xx:11,t:function(){ console.log(this.xx)}} //11//作为方法调用时,方法是引用类型,方法在内存方法快,哪个对象的属性指向它,它内部返回的就是哪个对象var dog = {xx:'wangwang'}dog.t = obj.tdog.t() //wangwang//3、作为构造函数调用时function Cat(name,age){    this.name = name    this.age = age    this.bark = function(){        alert('I am ' + this.name + '!')    }}var cat = new Cat('虎子',2);/*a、系统创建空对象{},(空对象constructor属性指向Cat函数)b、把函数的this-->指向-->该对象c、执行该函数d、返回该对象[注意]:如果函数作为构造函数运行时,return的值是忽略的,返回的还是对象*///4、函数被call、apply调用//4.1 call语法格式:函数.call(对象,参数1,参数2,...参数N)function t(num){   console.log('我的真实年龄是'+this.age+'岁,但我一般告诉别人我'+(this.age + num)+'岁')}// human.t = t// human.t(-10)//等价于上面注释的var human = {name:'李四',age:20}t.call(human,-5) //临时指向,动态将一个函数绑定到一个对象上并立即执行//4.2 apply语法/*obj.call(thisObj, arg1, arg2, ...);  obj.apply(thisObj, [arg1, arg2, ...]);两者作用一致,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj『继承』了obj的属性和方法。唯一区别是apply接受的是数组参数,call接受的是连续参数。function add(j, k){    return j+k;}*/function sub(j, k){    return j-k;}add.call(sub, 5, 3); //8add.apply(sub, [5, 3]); //8sub(5, 3); //2sub.call(add, 5, 3); //2sub.apply(add, [5, 3]); //2通过call和apply,我们可以实现对象继承。示例:var Parent = function(){    this.name = "yjc";    this.age = 22;}//除了给对象动态绑定方法,还能继承var child = {};console.log(child);//Object {} ,空对象Parent.call(child);console.log(child); //Object {name: "yjc", age: 22}//5、with使用// 5.1 with 语句可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性。要给对象创建新的属性,必须明确地引用该对象, 去除了多次写对象名的麻烦//举例function Lakers() {       this.name = "kobe bryant";       this.age = "28";       this.gender = "boy";}var people=new Lakers();with(people){   var str = "姓名: " + name + "<br>";   str += "年龄:" + age + "<br>";   str += "性别:" + gender;   document.write(str);}//代码执行效果如下://姓名: kobe bryant//年龄:28//性别:boy//练习1:var name='i am window'var obj = {name:'php',t:function(){console.log(this.name)}}var dog = {name:'huzi'}var tmp = obj.ttmp()//i am windowdog.t = obj.tdog.t() //huzidog.t.call(obj) //php(dog.t = obj.t)()//报错dog.t(...) is not a function,dog.t = obj.t的返回值是“值”,即t函数.强调的是值,说明不是通过引用来的调用,//而是立即使用函数本身,效果等同于(function(){alert(this.name)})(),null又被解释成widnow//练习2:/*    问:有一些有经验的,但对js理解不深的程序员说,有this操作的(如this.age=xx)函数不能直接调用,而是要new来调用,为什么?    答:因为直接调用,this只想的window将会污染全局变量*/
原创粉丝点击