JavaScript:公共、私有、受保护的

8

我一直认为"Public", "Private"和"Protected"关键词是用于PHP或Java的,而不是JavaScript,但最近才发现这些都是JavaScript保留字。

有人能给我举个例子,说明何时应该使用这些特定的保留字吗?因为我在JavaScript中从未见过或使用过它们,但我想知道何时应该使用。

谢谢。


1
它们目前并未被使用,只是已经为将来的使用所保留。 - Ingo Bürk
我不特别了解这些关键字,但我知道ECMA规范保留某些关键字以备将来使用。这些可能是其中一些关键字。 - Waleed Khan
let 在较新的 Mozilla 实现中使用。 - Teemu
5个回答


3

来自这个来源

“以下是ECMAScript未来关键字保留字…”

换句话说,它们目前没有功能。


2
ECMAScript 5标准在7.6.1.2中仅一次提到“public”、“private”和“protected”这些术语(不包括附录和版权声明)。

The following tokens are also considered to be FutureReservedWords when they occur within strict mode code (see 10.1.1).

implements let private public yield

interface package protected static
也就是说,它们目前不是语言的特性,但在严格模式下禁止使用这些标识符以为未来的使用留出空间。
请注意,ES5 仅在严格模式下禁止使用这些单词,但 ECMAScript 3 在任何情况下都禁止

7.5.3 未来保留字

以下单词用作提议扩展中的关键字,因此被保留以允许将来采用这些扩展...


0

如果您喜欢,可以使用ZNOW。 http://icarusso.github.io/ZNOW/private.html

private、protected和public是保留字。尽管ECMASCRIPT 6,即下一个JavaScript版本,支持class,但似乎并不支持所有的封装级别。此外,它的使用似乎有点冗长,并且在任何主要浏览器中都不可用。 http://wiki.ecmascript.org/doku.php?id=harmony:classes

我想不同的封装级别可以增加代码的可读性和可维护性。特别是在开发复杂程序和与其他程序员合作时。所以我设计了这个框架。:-)

它使用名称前缀来声明不同的封装级别:_表示私有,$表示受保护。 例如:

var ClassA=Class({
    init:function(a){ //constructor
        this._a=a;
    },
    foo:function(){ //public function
        return this._a;
    },
    _a:false //private attribute
})

var a=new ClassA('a');
console.log(a._a == 'a'); //false
console.log(a.foo() == 'a'); //true

这个框架让你可以在不痛苦的情况下,从Java转移到JavaScript的面向对象编程技巧。

另一个例子是单例模式。

var ClassA=Class({
    'static.getInstance':function(){
        if(!ClassA._instance) ClassA._instance=new ClassA();
        return ClassA._instance;
    },
    'static._instance':false,
    _init:function(){ //private constructor
        console.log('instance created');
    }
})

var a1=ClassA.getInstance(); //>instance created
var a2=ClassA.getInstance();
console.log(a1==a2); //>true

希望您会发现这个框架易于使用和阅读。 ZNOW还支持接口、抽象和常量。 这是链接:http://icarusso.github.io/ZNOW/

希望您喜欢它。


0

https://github.com/nooning/JSClass/ 支持私有、受保护的、公共的、友好的、静态的虚拟

Class(
{
    Namespace:ABC,
    Name:"ClassL3",
    Bases:{"ClassL2":{Namespace:ABC,Policy:Class.Policy.Public}},
    Private:{
        Leg:2
    },
    Protected:{
        TestProtected:0,
        fight:function(){
            console.log("ClassL3::fight "+this.constructor["."].Name);
            this.Leg--;
        }
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接