var Tim = new Person();
在实际代码中使用它
使用匿名函数创建私有范围:
var Person = function(){};
(function(){
var findById = function(){ /* ... */ };
Person.find = function(id){
if (typeof id == "integer")
return findById(id);
};
})();
我的理解
var Tim = new Person();
我能打电话给谁?我会试着找到蒂姆的身份吗?
答案 0 :(得分:3)
首先:您提供的代码段不会返回ID,但会在传递ID时返回一些内容。我必须承认,在私有范围方面,这个例子并不是最好的例子。我会给你一个更详细的,但我希望更清楚的例子:
(function ()
{
var personObjects = [];
var findById = function(id)
{
return personObjects[id];
}
var Person = function (name)
{
this.id = personObjects.length;//first available index ~= auto increment
this.name = name;
personObjects.push(this);
};
Person.find = function(id)
{
//I woudl do: id = +id;, but sticking to your example
if (typeof id === 'number')
{
return findById(id);
}
return undefined;
}
window.Person = Person;//expose to global object
})();
那么,我们在这里有什么。你说你了解范围,所以我假设你知道这里声明的所有变量在包装函数返回后将存活,但它们只对在同一范围内声明的函数可见。如果不是:personObjects
数组和findById
函数对象仍然存在,但只能由Person
构造函数访问,该构造函数是公开的(因为已分配)全局对象。 / p>
我正在使用数组的长度来确定实例化person对象时的下一个可用ID,从而为每个Object创建唯一的id。当您向其传递有效的id(数组键)时,函数findById只返回对其中一个对象的引用。 Person.find
方法调用此封闭函数,但在执行此操作之前会对参数进行一些检查。在某些特定情况下,这可能对调试或在长原型链中使用通用设置器和getter很有用。这就是为什么,至少对我来说,这个例子有点牵强作为起点。
无论如何,你这样称呼私有方法(findById
):
var tim = new Person('tim');
Person.find(0);// returns a reference to tim
//or even
var tom = new Person('Tom');
tim.find(1);//returns tom
tom.find(0);//returns tim
tim.find(tom.id);//...
同样,这种方法不太常见AFAIK,练习/习惯范围和闭包我建议使用setInterval
和事件委托(例如:尝试创建自己的委托者)移动设备上的tab
事件。只是谷歌他们,你很快就会明白为什么这是一个很好的练习,但起初有点令人生畏。
答案 1 :(得分:0)
您只能通过致电findById
来间接致电Person.find
:
// Assuming code similar to your code above
// Assume that Tim.id === 1
var someone = Person.find(1); // Call findById to get a reference to Tim
console.log(someone.name); // Tim
findById(1) // Error, findById is not available in the global scope