为什么Javascript具有特权功能

时间:2011-03-10 21:05:46

标签: javascript

在工作中进行讨论之后,我仍然没有对以下内容有满意的答案,在其他编程语言中我们都没有谈到特权函数。

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;
    }
}

它做的相同,但只是一种公共方法。

6 个答案:

答案 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访问。

我自己从未听说过特权这个词,你应该真正寻找封闭匿名功能