为什么Javascript有特权函数
经过工作中的讨论,我仍然没有一个令人满意的答案,关于下面的问题,在其他编程语言中,我们都没有提到特权函数为什么Javascript有特权函数,javascript,Javascript,经过工作中的讨论,我仍然没有一个令人满意的答案,关于下面的问题,在其他编程语言中,我们都没有提到特权函数 var kid = function(name) { // Private var idol = "Paris Hilton"; // Privileged this.get_idol = function() { return idol; }; } 我能想到的唯一逻辑是,如果你让一个公共函数返回一个私有变量,那么这个函数就
var kid = function(name)
{
// Private
var idol = "Paris Hilton";
// Privileged
this.get_idol = function()
{
return idol;
};
}
我能想到的唯一逻辑是,如果你让一个公共函数返回一个私有变量,那么这个函数就“有特权”这样做(因为你不能直接调用它)
在php中我们也可以这样做,但我们不使用这个别致的名称,我也记不起使用这个术语的任何其他语言
你甚至可能会发现,如果你需要一个“特权”功能,你的整个方法都是错误的,因为如果你需要从外部访问它,为什么不直接公开它呢
另一方面,私有变量不能从外部更改,因此它将受到保护。但是展示在外面
最后,作为纯javascript的新手,这个术语有点让人困惑,imho只是一个花哨的名字,让人更困惑,因为在php中,它也会变得像javascript:
class kid
{
// Private
private idol = "Paris Hilton";
// PUBLIC OR PRIVILEGED ?
public function get_idol()
{
echo $this->idol;
}
}
它也有同样的功能,但只是一个公共方法。我从未听说过特权函数;正确的术语是:在一个作用域中定义一个函数,该函数可以访问在其外部作用域中定义的变量。闭包可以在很多语言中使用(Javascript、Python、Lisp/Scheme都可以,Java也可以部分通过内部类实现,这些内部类可以到达闭包范围中的最终变量)
对象的成员变量(例如Java/Javascript中的this.foo或PHP中的this->foo)不同。是的,该模式用于模拟私有属性和访问它们的公共方法 JavaScript实际上没有对象的公共/私有属性/函数。私有属性是构造函数中的一个局部变量,子函数可以访问它(javascript术语中的“闭包”)。然后,子函数的引用作为属性添加到对象中
我认为“特权功能”一词并不常用。我只在“面向对象的JavaScript”教程中见过它。JavaScript没有特权或任何功能。它的所有函数都是闭包,而闭包就是在那里使用的,C#也有闭包和大多数函数语言 如果需要,可以使用该语言的密码,但密码中不会出现privileged一词 这个术语似乎来自于,但它只是将闭包概念简化为一个特定的使用案例,我想是面向对象编程类型
Javascript在设计方面可能比大多数OOP语言更强大,但您需要以开放的思维和理解功能概念来处理它。试图强迫它成为另一种OOP语言将是一个坏主意,也是一种耻辱。您正确地推断其目的是使变量
idol
私有化。只能从外部读取,不能修改
但是PHP中的代码并不等价,因为JSkid
是一个包含内容的函数。一个更常见的习语是:
var kid = function() { return {}; }();
这里的关键是现在kid是在函数中定义的对象,因此可以隐藏kid
的所有私有状态,并且只有附加的公共方法可用
var kid = function(name)
{
// Private
var aVal = 1;
// Privileged
this.get_idol = function()
{
return aVal++;
};
}
var myKid= new kid();
//returns:1
myKid.get_idol();
//returns: 2
myKid.get_idol();
//returns: 3
myKid.get_idol();
可能有人使用了privileged这个词,只是为了说明var aVal=1代码>即使在执行匿名函数后仍然存在,可以从get\u idol
访问
我自己从来没有听说过“特权”这个词,实际上你应该寻找“闭包”和“匿名”功能,公共、私有和特权这三个术语不属于JS语言定义的一部分。正如其他地方提到的,Douglas Crockford推广了JS特权这个术语
关键是JavaScript支持信息隐藏
public与privileged的显著区别在于,当您将函数定义为原型的一部分时,该函数无法访问私有成员。例如:
kid.prototype.doSomething = function () {
// Cannot access the idol property
};
我建议您阅读一下JS对OOP(基于原型)和闭包的理解。您的JS示例与类
声明几乎没有关系。@deinan,发布的代码是用JavaScript模拟类的标准方式。我完全同意。Javascript是一种有趣的语言。在javascript中真正拥有“私有变量”的唯一方法是通过闭包。只有定义变量范围内的函数才能访问它。该功能/范围之外的任何内容都不起作用。我不相信javascript的设计考虑了面向对象的实践。这似乎更多的是事后诸葛亮。这应该是公认的答案。这是关于闭包和它们创建的作用域的,仅此而已。嗯,您的示例完全错误,它应该类似于var counter=function(){var x=0;return function(){return++x;}}()代码>谢谢你指出ECMA规范,实际上从未在那里看过,你也是对的:这个术语确实来自crockford的网站,可能也在其他网站上找到。所以最终没有特权这回事。。(感谢上帝!)是的,crockford有一个发明新术语的坏习惯。这一页: