js中的this

//this
//1、如果是普通方法,this指向window,准确的说是this指向null被解释到window,在ECMASCRIPT5,如果this为null,则解释成undefined
function 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.t
dog.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); //8
add.apply(sub, [5, 3]); //8
sub(5, 3); //2
sub.call(add, 5, 3); //2
sub.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.t
tmp()//i am window
dog.t = obj.t
dog.t() //huzi
dog.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将会污染全局变量
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值