在工作中进行讨论之后,我仍然没有对以下内容有满意的答案,在其他编程语言中我们都没有谈到特权函数。
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;
}
}
它做的相同,但只是一种公共方法。
答案 0 :(得分:12)
Javascript没有特权或任何功能。所有它的功能都是闭包,那就是那里使用的东西,C#也有这个和大多数功能语言。
如果您需要,该语言的ECMA norm可用,特权字不会出现在其中。
该术语似乎来自http://www.crockford.com/javascript/private.html,但它仅仅是关闭概念的简化,以及针对OOP程序员类型所针对的特定用例。
Javascript可能比大多数OOP语言在设计方面更强大,但您需要以开放的心态和理解功能概念来处理它。试图强迫它成为另一种OOP语言将是一个坏主意和耻辱。
答案 1 :(得分:7)
我从未听说过特权功能;正确的术语是closure:您可以在作用域中定义一个函数,该函数可以访问在其外部作用域中定义的变量。闭包可以在很多语言中使用(Javascript,Python,Lisp / Scheme都可以,而Java部分通过可以在闭包范围内访问最终变量的内部类)。
对象的成员变量(例如,Java / Javascript中的this.foo或PHP中的this-> foo)是不同的。
答案 2 :(得分:5)
是的,该模式用于模拟访问它们的私有属性和公共方法。
JavaScript实际上没有对象的公共/私有属性/函数。私有属性是构造函数中的局部变量,可以由子函数访问(javascript术语中的“闭包”)。然后将对子函数的引用添加为对象的属性。
我认为“特权功能”一词并不常用。我只在“面向OOP人的JavaScript”教程中看到过它。
答案 3 :(得分:2)
术语public,private和privileged不是JS语言定义的一部分。正如其他地方所提到的,道格拉斯·克罗克福德(Douglas Crockford)推广了JS特权这一术语。
重点是JavaScript支持信息隐藏。
公共与特权的显着区别在于,当您将函数定义为原型的一部分时,该函数无法访问私有成员。例如:
kid.prototype.doSomething = function () {
// Cannot access the idol property
};
答案 4 :(得分:0)
您正确地推断出目的是使变量idol
变为私有。它只能从外部读取,不能修改。
但是PHP中的代码并不等效,因为JS kid
是一个包含东西的函数。一个更常见的习语就是:
var kid = function() { return {}; }();
这里的关键是现在kid是函数内部定义的对象,因此kid
的所有私有状态都可以隐藏,只有附加的公共方法可用。
答案 5 :(得分:0)
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();
可能有人使用了特权这个词,只是为了表明即使在执行匿名函数后var aVal = 1;
存在,也可以从get_idol
访问。
我自己从未听说过特权这个词,你应该真正寻找封闭和匿名功能