//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将会污染全局变量
*/
js中的this
最新推荐文章于 2021-12-19 19:17:36 发布