在javascript中将方法应用于对象和私有变量

时间:2009-07-12 06:24:04

标签: javascript function object

我正在尝试将方法应用于涉及使用其私有变量的现有对象。对象设置如下:

function a(given_id)
{
    var id= given_id;
}

现在我想像它一样应用一些新方法

my_obj = new a('some_id');
my_obj.myMethod = function(){
    alert(id);
}

现在如果我去my_obj.myMethod()我得到一个错误,说id未定义。 如果我将id从私有更改为public,则此代码有效。

我不明白为什么会发生这种情况,因为如果myMethod最初是作为一种特权方法定义的,那么它就可以了。我唯一能想到的是myMethod被添加为公共方法,而不是特权方法。

非常感谢有关此事的任何信息。

4 个答案:

答案 0 :(得分:3)

我认为您正在尝试创建“特权方法”,基本上是一种能够访问私有变量的方法:

function a(given_id) {
     var id= given_id;

     this.myMethod = function()
     {
       alert(id);
     }
}

你不能在构造函数之外声明特权方法,因为如果你这样做,他们将无法访问构造函数的闭包。

推荐读物:

答案 1 :(得分:2)

使用this.id = ...而不是var id = ...(var将只为你的函数范围提供局部变量)。

{edit}试试:

function Foo(givenId)
{
    var id = givenId;

    this.Bar = function() {
        WScript.Echo(id); //change this to alert(...)
        }
}

var foo = new Foo(52);
foo.Bar();

同样,函数中的var具有函数作用域(局部变量)。如果您想要访问它,请将您的特权函数声明为外部函数的内部函数,并使用闭包来访问它。

答案 2 :(得分:1)

你无法做你想做的事,因为JavaScript中没有私人成员(本身)。在函数返回新对象后,会立即丢弃构造函数内的var。因此,以后无法访问它。使其粘贴在某处的唯一可能方法是通过在构造函数中声明成员函数(this.foo = function(){};)来在闭包中捕获它。您必须在构造函数中声明此成员函数的原因是因为您需要具有嵌套作用域才能创建闭包。通过将该函数声明为原型对象的成员或通过将其分配给已创建的对象,您将丢失嵌套的作用域,因此无法关闭并且无法访问所谓的私有成员。

答案 3 :(得分:0)

我认为你误解了私有变量的概念。你想要做的是访问私有var,因为它受到保护,但JS对象中没有受保护的变量。当您在声明之外修改对象时,它将被视为祖先。