Javascript 为什么特权方法和公共方法之间有区别?如何知道使用哪个?

Javascript 为什么特权方法和公共方法之间有区别?如何知道使用哪个?,javascript,ecmascript-5,Javascript,Ecmascript 5,为什么特权方法和公共方法之间有区别 我为什么还要为公共方法而烦恼呢,它们不是特权 方法更自然?当允许访问时,他们感觉更直观 与java中的私有方法和变量类似 这背后是否有具体原因,或者这是一个错误 规格(有点超前了!)还是我遗漏了什么 在什么情况下,您会使用公共方法而不是特权方法 下面是要演示的代码: var Foo = function(){ var privateVar = "i am private"; function privateFunc(){ co

为什么特权方法和公共方法之间有区别

  • 我为什么还要为公共方法而烦恼呢,它们不是特权 方法更自然?当允许访问时,他们感觉更直观 与java中的私有方法和变量类似

  • 这背后是否有具体原因,或者这是一个错误 规格(有点超前了!)还是我遗漏了什么

  • 在什么情况下,您会使用公共方法而不是特权方法 下面是要演示的代码:

    var Foo = function(){
        var privateVar = "i am private";
        function privateFunc(){
            console.log(privateVar);
        }
    
        this.privilegedFunc = function(){
            privateFunc(); // can access
    
        }
    };
    
    Foo.prototype.publicFunc = function(){
        privateFunc(); // cannot access
    };
    
    var foo = new Foo();
    
    foo.privilegedFunc(); // prints "i am private"
    foo.publicFunc(); // Uncaught ReferenceError: privateFunc is not defined
    

    如果您需要在实例、public、else和private之外调用方法,它就像任何OOP语言一样(尽管没有可见性关键字)

    无法在作用域之外访问未绑定到此的函数,因为它们是在构造函数的作用域中定义和声明的

    根据您最近的评论,有很多原因和场景,您必须公开一个对象函数,以便被其他对象使用,例如

    根据您在回答中的评论,让我们看看原型方法的一些优点

    通过使用prototype,您可以更改方法,并且更改将反映到共享同一原型的所有实例,如果没有prototype,每个实例都将有其自己的给定方法版本,因此您必须逐个更改它们

    另一个优点是性能,原型中声明的函数/方法只创建一次,而没有原型,每次使用
    new
    关键字从构造函数实例化时,都必须创建构造函数函数范围内的所有函数

    为什么特权方法和公共方法之间有区别

    我假设你读过道格拉斯·克罗克福德的网站。这是一个我没有真正看到其他作者使用的区别。我没有做出区分,但我知道函数可以访问构造函数闭包

    为什么我还要为公共方法而烦恼,特权方法不是更自然吗?它们更直观,因为它们允许访问java中的私有方法和变量

    它们的含义不同于
    public
    方法

    A) 它们由构造函数定义,因此,它们可以访问构造函数范围。这是他们的特权

    B) 它们不是它的原型所共有的

    A表示每次调用构造函数时都会实例化函数。当您使用原型时,它只是链接的

    B意味着它们本质上是不同的功能

    obj1.privileged !== obj2.privileged
    
    这背后有没有具体的原因,或者这是规范中的错误,或者我遗漏了什么

    从我看到的地方看没有错误。这只是一种语言特征

    在什么情况下,您会使用公共方法而不是特权方法


    当您不需要访问构造函数内部的任何闭包,并且希望利用原型链时。

    需要注意的是,规范中没有区分“特权”和“公共”方法(事实上,我认为规范根本没有使用这些术语-道格拉斯·克罗克福德使用了这些术语),它们由完全相同的规则管理,其中最基本的规则是功能范围

    注意:我在回答中会遵循您的术语,但实际上我建议您不要这样做:您经常会发现有人将您的特权方法称为公共方法,而将您的公共方法称为原型方法

    在您的示例中,
    this.privilegedFunc
    可以访问私有变量
    privateFunc
    ,因为它们定义在相同的范围内,即
    Foo
    构造函数的范围内
    privilegedFunc
    即使从“外部”调用,也可以通过语言的所谓闭包机制使用其对
    privateFunc
    的引用

    要直接回答您的问题:

    为什么特权方法和公共方法之间有区别

    没有根本区别。您在不同的范围内定义了两个函数,因此,它们可以引用不同的变量

    为什么我还要为公共方法而烦恼,特权方法不是更自然吗

    自然是一个相当主观的术语。但是,如果不希望直接公开字段,则需要使用特权函数从外部操纵字段

    它们更直观,因为它们允许访问java中的私有方法和变量

    这种直觉仅基于熟悉程度:)难怪当您尝试将Javascript用作Java时,两种语言中工作方式不同的部分似乎最不直观。这并不意味着你应该尝试模仿你在其中任何一种中使用的风格,有些解决方案更适合Javascript,有些更适合Java

    这背后有没有具体的原因,或者这是规范中的错误,或者我遗漏了什么

    (规范中有这样一个根本性的错误?!上帝没有。)我不确定你所说的“这”是什么意思,但可见性的差异是由函数范围解释的,见上文

    在什么情况下,您会使用公共方法而不是特权方法

    例如,如果不需要通过闭包公开私有字段。另一个值得注意的区别是,原型上的函数将在实例之间共享(即实际上是同一个函数实例),而私有和特权方法对于实例来说是唯一的,这可能会影响内存占用。

    您所称的“特权”方法不属于语言语法的一部分。相反,这是一种设计模式。这是可能的,因为javascript实现了闭包(ABLI