第一,你可能对对象原型有什么误解。
对象原型是用在以 new 关键字调用函数来构造对象生成的对象上的。
function Person(name){
this.name=name
}
Person.prototype.age=10;
Person.prototype.intro=function(){
return "我叫"+this.name+",我"+this.age+"岁了。"
}
对象原型是那些专门用来以 new 关键字构造对象的函数上存储的一个名为 prototype 的对象,这个对象里存储着一个规定的对象结构上一定有的属性以及它的初始值。
比方说我要创造一个人,好,一个人应该有什么?名字、年龄等等。每个人的身上的这些概念都是一样的而且大家都有,那我在每创造出一个人的时候何必每次都要去定义一遍这些概念,直接弄个大概的模子,然后再每次在这个模子上再去定义那些不一样的地方不就好了?
对于 javascript 来说也是一样,把那些一模一样的东西写进代码逻辑里,每次都完完全全再来一遍效率实在是太低了,而且对象上那些一模一样的函数还吃那么多内存空间,实在是不能忍受。解决这个问题的对应方法就是对象原型。对象原型最大的好处就在于,对于同一类对象上面那些一模一样的结构,在生成对象的时候只需要搬过去就可以了,而且对于对象上的方法而言,大家要做的都是一样的,犯不着每个对象上面都要生成一个函数,那样太占空间了,大家直接共用一个函数(rbq?),创建对象的时候只需要把函数的地址搬过去就好,即块又省空间,如果函数要访问不同的对象只需要一个 this 就好了,实在大快人心。
var lsp=new Person("老色批") ↓
Person {
name:"老色批",
(下面的是原型属性,在浏览器控制台里是隐藏的,因为这些不是属于单个对象独有的)
age:10,
intro:function(){
return "我叫"+this.name+",我"+this.age+"岁了。"
}
}
lsp.intro() //"我叫老色批,我10岁了。"
所以,首先你上面的写法都不属于对象原型,没有使用 this 的意义。当然用了也无妨,因为效果是一样的。
第二,你是想在元素的事件函数里访问外面那个装着元素的对象的话,那我告诉你用原型方法还有 this 是不可能的,因为除了原型方法用到 this ,事件函数也会用到 this,事件函数里的 this 指向的是触发事件的那个对象,也就是元素(注意元素在js里也是对象),所以你只能是通过作用域链,在构造对象的时候把 this 赋值给一个变量,然后在事件函数里访问这个变量。
当然,你目前的写法也不是对象原型写法,而且对象原型也办不到,所以还是乖乖用 ret.a 吧。