我认为范围链会做出第一个“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(){
}
编辑:我的意思是不工作,它说测试是'未定义的'
答案 0 :(得分:2)
这很简单。您的Tool
实例没有init
方法。代码中的init
函数只是Tool
构造函数的局部函数。 Tool
个实例不会继承此类函数。
如果您希望Tool
个实例拥有init
方法,您可以:
将其指定为构造函数中的方法:
function Tool () {
this.init = function () { ... };
}
或将其分配给Tool.prototype
(构造函数之外!):
Tool.prototype.init = function () { ... };
第二个选项表现更好,因为所有实例共享相同的init
函数。 (在第一个选项中,每个实例都有自己的init
函数,该函数在构造函数调用期间创建。)
答案 1 :(得分:1)
您是否尝试访问工具范围内的test
或其返回的对象?它们是两个不同的变量。我把它们标记为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; }