javascript中的私有和公共方法

时间:2014-06-24 18:48:26

标签: javascript oop

如何使用公共和私有方法在javascript中设计对象?

如何从private_method访问私有方法API.get

function API(){
    function private_method(){
        return 'weeee';
    }
}

API.prototype.get = function(){
    // access "private_method"
};

4 个答案:

答案 0 :(得分:3)

您可以创建一个自动执行的函数,在函数的作用域中包装私有方法。

// Self-executing function
var API = (function() {

    function API() {};

    API.prototype.get = function() {
        // can call private_method.
        private_method();
    }

    // Accessible from the object created in this scope.
    function private_method() { }

    return API;

})();

此方法可以防止每次调用构造函数时执行不必要的代码。

这是一个工作小提琴:http://jsfiddle.net/7QM9h/

答案 1 :(得分:2)

我不确定这是否是您正在寻找的: JavaScript private methods

您需要在API中创建一个包含您想要私有的所有函数的var。

基本上,外部对象成为具有这些功能的容器,但在函数本身内,它们处理私有变量所拥有的私有信息。增加的功能将无法成为原型的一部分,以使其成为私有

function Restaurant() {

    var myPrivateVar;

     var private_stuff = function()   // Only visible inside Restaurant()
     {
         myPrivateVar = "I can set this here!";
     }

     this.use_restroom = function()   // use_restroom is visible to all
     {
         private_stuff();
     } 
}

(我知道这会更适合评论,我道歉)

答案 2 :(得分:2)

function API() {
    var private_method = function() { return "weee"; }
}

要使private_method仅在API内可见,您应该将其设置为声明的变量。但是,这意味着private_method不属于API.prototype

function API() {
    this.public_method = function() { return "weee"; }
}

使用this会使API的所有实例都可以看到。

答案 3 :(得分:1)

这里的其他答案都不是很糟糕,但它们并没有找到你问题的真正核心。

实际上,在JavaScript中没有私有方法。大多数情况下,这是因为在JavaScript 中没有方法这样的东西。不是真的。

现在,在一群人跳下我的喉咙之前,让我澄清一点:在纯粹的面向对象语言的意义上,没有一种方法。在传统的OO语言中,如果您创建了一个实例方法,那么调用该方法的 only 方法就是针对该类的实例。在JavaScript中,您可以将函数附加到对象原型,并且在针对在其原型链中具有该函数的对象调用时将它们视为方法,但在一天结束时,该方法"方法&# 34;实际上只是一个函数,当它以某种方式调用时,它就像一个方法。

你可以看看这两种方式中的一种:要么是糟透了,因为它不支持基本的东西,比如方法或JavaScript很棒,因为你可以拥有基本上像方法一样的东西,但可以更灵活的方式使用太。我更喜欢第二种观点,但YMMV。

所以,回到你的问题。简短的回答是" JavaScript并没有真正的方法,所以它实际上没有私有方法。"更长的答案是"您可以通过利用JavaScript的函数范围来模拟私有方法。"我说模拟因为这种方法并不真正导致方法,但它确实会影响功能隐藏。要做到这一点,你可以使用一个立即调用的函数表达式(IIFE)来确保私有函数(记住:不是真正的方法)在外部不可用:

var API = (function(){

    var secrets = {};
    var nextId = 0;

    // in function scope here; anything declared here won't
    // be available externally
    function set(public, secret) {
        // we can use 'this' here, but be careful!
        // if we don't call this function correctly,
        // 'this' will be bound to the global scope


        // here we set a normal (public) instance variable
        this.message = 'not secret: ' + public;

        // here's how we can simulate a private "instance varaible"
        secrets[this.id] = secret;
    }

    function API() {
        this.id = nextId++;
    }

    API.prototype.public = function() {
        // we can't call 'this.secret()' here because secret is
        // not a method on this object

        // we can call secret(), but that will not do what we want:
        // it will break because the global scope doesn't have the
        // variable we need

        // we can, however, do this:
        set.call(this, 'hello world!', 'i am secret');  
    }
    API.prototype.tellSecret = function() {
        return secrets[this.id];
    }

    return API;
})();

var api = new API();
api.public();
console.log(api);   // won't print any secret info; we also
                    // can't call api.secret()
console.log(api.getSecret());

通过这种方式,我们模拟了数据功能的隐藏。请注意,我们必须为每个API提供唯一的ID。但是,此处存在一个漏洞:由于id是每个API实例的公共属性,因此您可以将其设置为另一个数字,并访问另一个对象的机密信息!您可以使用Object.prototype.defineProperty锁定id属性并关闭此漏洞。

我希望这能突出显示JavaScript中隐藏/限制所涉及的一些问题。