function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype = {
sayName : function(){
return "my name is " + this.name;
//alert(this.name)
},
sayAge : function(){
return "I'am " + this.age + " old";
}
}
var person = new Person("leo",29);
lisi = {
name : "lisi"
}
person.sayName.call(lisi);
alert(lisi.sayName()); // lisi.sayName is not a function
为什么呢?是我写法的问题吗?
第二个问题:
person.sayName.call(lisi)跟Person.call(lisi)的区别是什么?
我的理解是:后者借用了Person全部的属性跟方法,而前者只是借用了sayName方法而已。(我的理解好像是错的~55555)
看完题主修改后的提问,终于知道问题在哪了:不是改变lisi的this让他拥有sayName,而是改变person.sayName的this,使得其能够访问lisi.name
这很对啊,你之前不都写明了么,
lisi
只有一个属性name
,哪来的sayName()
我不知道你是不是受到网上某些奇怪教程的影响,反正我看到过有一个教程把
call
等价为将Person
中的代码复制到lisi
里去了,这种“等价”显然是错的Func.call(Obj)
的用处是将Func
置于Obj
的上下文中去执行。简单来说,就是在执行Func
时假装当作Func是在Obj内部的一样,从而使Fun
拥有访问Obj
属性的能力