1个回答
展开全部
//这种普通的函数不足以体现this关键字
function Person(_name){
this.name = _name;
this.say = function(){
return 'my name is'+this.name;
}
}
var p = new Person('zhangsan');
p.name;//张三
p.say();//my name is zhangsan
//不new
var p = Person('lisi');//
p;//undefined 当然是undefined 因为没用new 关键字开辟一个新对象,
只是普通的运行了Person这个方法,因此p没有在内存中指向任何对象的实例
//但是 运行了 ,那么name 和 say 去了哪
window.name;//lisi
window.say();//my name is lisi
//总结
当使用new 关键字时候,this 指向的是当前开辟的这个对象实例,因此外部用一个变量引用它,就可以使用这个新对象实例
当不使用new,this就是指向window 。但是对于dom事件中,需要另外理解了。
//关于call 和 apply 区别在于传参数的方式,call必须一个个传,apply是穿数组,因此可以直接使用arguments
就利用上面的Person,我们建立一个Child
function Child(name,age){
this.age = age;
Person.call(this,name);
//或者 Person.apply(this,[name]);
}
//使用
var c = new Child('chiid',23);
c.name;//child
c.age;//23
c.say();
//此时Child中的this,当然是new的时候那个Child的实例,也就是被var c 引用的,
然后利用 Person.call/apply 将当前this 对象传递给Person,使得Person中的this指向了本次Child的实例--—>c ,因此 Child 利用这样的方式继承了Person的name和say方法
//不懂很正常的,这个要从内部实现-->内存上去理解。
更多追问追答
追问
亲,,我还是不懂,有些乱。就apply和call不懂
他们的区别我懂...但是怎么运行的我真心不懂
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询