在JavaScript类中声明变量:this和var有什么区别?

6

在 JavaScript 类中,使用 thisvar 声明内部变量有什么区别呢?

例如:

function Foo( ) {
   var tool = 'hammer';
}

function Foo2( ) {
   this.tool = 'hammer';
}

我们已经知道的一个区别是,Foo2.tool会返回“hammer”,而Foo.tool会返回undefined。
还有其他区别吗?您对其中一个与另一个有何建议?
谢谢!

显然,它们有不同的用途。如果你没有使用this.tool的理由,就使用var tool - Blender
谢谢,Blender!您介意详细说明它们所服务的不同目的吗? - Crashalot
由于在类外部无法使用 var tool,因此它不是为在类外部使用而设计的。this.tool 是为了从类外部调用而设计的。 - Blender
2
http://phrogz.net/js/classes/OOPinJS.html - meder omuraliev
1个回答

17

这里不存在“二选一”,因为这两个的目的是不同的。

考虑以下情况:

var Melee = function(){

    //private property
    var tool = 'hammer';

    //private method
    var attack = function(){
        alert('attack!');
    };

    //public property
    this.weapon = 'sword';

    //public methods
    this.getTool = function(){
        return tool; //can get private property tool
    };
    this.setTool = function(name){
        tool = name; //can set private property tool
    };
};

var handitem = new Melee();
var decoration = new Melee();

//public
handitem.weapon;                 //sword
handitem.getTool();              //hammer
handitem.setTool('screwdriver'); //set tool to screwdriver
handitem.getTool();              //is now screwdriver

//private. will yield undefined
handitem.tool;
handitem.attack();

//decoration is totally different from handitem
decoration.getTool();            //hammer
  • handitem.weapon 在面向对象编程中是一个“公共属性”,可以从外部访问。如果我创建了这个Melee实例,我可以访问和修改weapon,因为它对外开放。

  • handitem.tool 是一个“私有属性”。只能从对象内部访问它。它不可见、不可访问,也不能(至少直接)从外部修改。尝试访问它将返回undefined

  • handitem.getTool 是一个“公共方法”。由于它在对象内部,它可以访问私有属性tool并从外部获取它。是连接私有世界的桥梁。

  • handitem.attack 是一个私有方法。像所有私有内容一样,它只能从内部访问。在这个例子中,无法调用attack()(所以我们安全免受攻击:D)


谢谢,约瑟夫。为了澄清,如果我们创建不同的Melee实例,每个实例都会得到自己的“tool”副本吗?还是更新一个实例将覆盖其他实例的“tool”? - Crashalot
不,每次调用 new Melee() 都会创建一个新对象。更新一个对象的属性不会改变另一个对象的值。 - Joseph
1
当你使用 new 关键字时,将会创建一个新的独特对象并传递给 Melee 函数。因此每个对象都有自己独立的 weapon 属性。然而,在 @Joseph 的代码中,tool 变量是函数作用域变量,所以你不能直接从函数外部修改它。你需要一个 setTool 方法来实现修改。 - Peter Lyons
太棒了,谢谢!最后一个澄清:如果我们有一个名为“buyTool”的新函数,我们需要使用“this.getTool()”还是“getTool()”来调用“buyTool”函数内部的“getTool”函数? - Crashalot
这个 buyTool() 方法在哪里?它在对象中吗?它是私有的还是公共的? - Joseph
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接