日期:2014-05-16  浏览次数:20394 次

拎不清: this, prototype 与 var 的区别
例如:
function BinaryTree()
{
  var treeRoot_;  
  var insertIter = function(data)
  {
  *****  
  }
}

问题: 
  在类似于上面的代码中, 对于method insertIter, 采用上面的表达方式 var ,或者使用
this.insertIter = function(data){}
或者
BinaryTree.prototype.insertIter = function()

除了表达方式, 在范围,或者别的方面有啥区别么?

敬请指教. 多谢.

 

------解决方案--------------------
var:
就是定义变量。在你这里的意思是定义一个函数引用insertIter,指向一个匿名函数。
由于是在函数内部定义,作用域也在函数内部,所以外部无法访问这个函数。
var bt = new BinaryTree();
bt.insertIter()是错误的。外部无法访问。
你可以将其理解为c++中的private函数

this:
this代表当前的上下文环境。
如果用this.inertIter = function(...)
var bt = new BinaryTree();
bt.insertIter()是正确的。外部可以访问。

prototype:
prototype表示原型对象,这个话题可多了。
与上面调用类似,外部可以调用。
但是很重要的区别在于:this定义的函数是在new的时候将匿名对象引用插入到每个对象中。
而prototype定义的函数是定义的时候copy函数的引用到对象中。前者中每个对象都有自己的函数体,后者都是指向prototype中的引用。
故一般定义类的时候都用prototype,这样对象多的时候,函数体也才一个。
------解决方案--------------------
var 定义的变量是局部的,类的其他函数里无法访问,但用prototype定义的可以比如
var treeRoot_;
var insertIter = function(data)
{
*****


如果在你在外面用下面语句定义类的另一方法
treeRoot.prototype.other=function(){
}
那么它是无法访问你定义的变量 insertIter 的但通过prototype可以