-1

我认为范围链会成为第一个“test = new test();” 工作,但它没有。为什么?

var tool = new Tool();
tool.init();

function Tool(){
    var test;

    function init(){
        //does not work, undefined
        test = new Test();

        //does work
        this.test=new Test();

        console.log(test);
    }
}

function Test(){
}

编辑:我的意思是不工作,它说测试是'未定义'

4

2 回答 2

2

这很简单。您的Tool实例没有init方法。您代码中的init函数只是Tool构造函数的本地函数。Tool实例不继承此类功能。

如果您希望您的Tool实例有一个init方法,您可以:

  1. 将其分配为构造函数中的方法:

    function Tool () {
        this.init = function () { ... };
    }
    
  2. 或将其分配给Tool.prototype(在构造函数之外!):

    Tool.prototype.init = function () { ... };
    

第二个选项执行得更好,因为所有实例共享相同的init功能。(在第一个选项中,每个实例都有自己的init函数,该函数是在构造函数调用期间创建的。)

于 2012-11-09T19:02:34.160 回答
1

您是要test在 Tool 范围内访问,还是在它返回的对象上访问?它们是两个不同的变量。我将它们标记为 A 和 B:

var tool = new Tool();

function Tool(){
    var testA; // Private

    this.init = function(){
        testA = 1;

        this.testB = 9; // Public
    }

    this.getTestA = function(){ // Public method to access the private testA
        return testA;
    }

}

tool.init();

console.log( tool.getTestA() ); // 1
console.log( tool.testB ); // 9

testA被称为私有变量,只能通过工具的方法访问,testB而是公共的。

这是否涵盖了您正在寻找的内容?

顺便说一句,如果您要创建很多 Tool 的实例,请记住使用 Tool 的原型来定义函数,这样您的代码会更节省内存,如下所示:

function Tool(){
    var testA;
}
Tool.prototype.init = function(){
    testA = 1;
    this.testB = 9;
}
Tool.prototype.getTestA = function(){  return testA; }
于 2012-11-09T19:07:08.187 回答