var name = "this is window"
var a = {
name:"this is a",
callname:function(){
alert(this.name)
}
}
function B(){
alert(this.name)//this is B
}
B.prototype.name = "this is B";
B.prototype.callname = function(){
alert(this.name)
}
B.callname = function(){
alert(this.name)
}
//a.callname()
//B.callname()
//(new B()).callname()
最后三个分别得出的是什么值???
在回答你的问题前,我们先看一个例子
接下来一个一个拆解你的问题 (请使用Chrome浏览器的开发者工具验证)
B.callname() 输出什么?
B是一个函数,它的 name="B", B.callname这方方法被调用,调用者是B,那么 callname方法中的this就是指代B, B.name还记得是什么吗? 往上看第一个例子就明白了。
你会追问,为什么不是 B.prototype.name定义的"this is B"? 因为B的prototype中定义的属性只能被B的实例直接访问。
你还是不信,那么请你将所有的 name 都改个名,比如 xname ,本题的答案就变为了 undefined
a.callname() 输出什么?
a本身就是个对象实例,它采用JSON方式定义。 以上代码相当于
callname的调用者是a,那么callname中的this就是a
(new B()).callname() 输出什么?
首先,
new B()
先执行, 创建了一个匿名实例,我们暂且给他命名为b, 即b = new B()
, 函数B中的this此时被指代为 b, 然后才是依次执行B函数体内的方法alert, b.name是什么?b是个实例,它本身没有name属性, 就会去父类的prototype定义中找name,找到了 "this is B".new B()
先执行, 创建了一个匿名实例,我们暂且给他命名为b, 即b = new B()
, 函数B中的this此时被指代为 b, 然后才是依次执行B函数体内的方法alert, b.name是什么?b是个实例,它本身没有name属性, 就会去父类的prototype定义中找name,找到了 "this is B".然后,
b.callname()
然后,b.callname()
执行, callname中定义的this此时指代了方法调用者b, 实例b本身没有name属性, 它会去找到父类中prototype的name属性值返回.第一个中,this表示对象 a,所以弹出 this is a
第二个中,B 表示函数 B,弹出的是函数的名字 B
第三个会先弹出 this is B,因为实例化的时候会执行函数。然后会有一个语法错误,是因为 (new B()) 前面的语句没有加分号。如果没有语法错误的话,还会再弹出一个 this is B,是因为实例对象调用原型对象上的 name 属性。