如何使用公共和私有方法在javascript中设计对象?
如何从private_method
访问私有方法API.get
?
function API(){
function private_method(){
return 'weeee';
}
}
API.prototype.get = function(){
// access "private_method"
};
答案 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中隐藏/限制所涉及的一些问题。