如何给出指向对象新实例化的指针

How do I give a pointer to a new instantiation of an object?

本文关键字:实例化 指针 对象      更新时间:2023-09-26

请看下面的一段简化代码:

myVar= 1;
myFunc = function() {
    return { val : myVar };
};
myInstantiation = new myFunc();
console.log(myInstantiation ); //{val:1}
console.log(myVar); //1
myVar=2;
console.log(myInstantiation );//{val:1}
console.log(myVar); //2

是否有任何方法我可以声明myInstantiation,或myFunc,以便仍然做同样的事情(例如实例化对象),但在这样一种方式,将允许我改变myVar,并有改变反映在myInstantiation内?

例如,我希望输出为

console.log(myInstantiation );//{val:2}
console.log(myVar); //2

不直接,不(好吧,您可以使用ECMAScript5)。表达式

return { val: myVar };

…取myVar并将其赋值给新对象的val属性。val属性的值和myVar属性的值之间没有持久的联系。

最直接的方法就是让val成为一个函数,而不是一个属性:

myVar = 1;
myFunc = function() {
    return {
        val: function() {
            return myVar;
        }
    };
};
myInstantiation = new myFunc();
myVar = 2;
alert(myInstantiation.val()); // alerts "2"

生活例子

如果作为属性,可以使用ECMAScript5:您可以定义一个函数,当有人访问对象属性时调用,使用新的Object.defineProperty函数:

myVar = 1;
myFunc = function() {
    var rv = {};
    Object.defineProperty(rv, "val", {
        get: function() {
            return myVar;
        },
        set: function(newVal) {
            myVar = newVal;
        }
    });
    return rv;
};
myInstantiation = new myFunc();
myVar = 2;
alert(myInstantiation.val); // alerts "2"

实时示例-在Chrome,最新版本的Firefox或最新版本的Safari(但不包括Opera或任何版本的IE)中运行。

它仍然是一个函数调用,具有隐含的开销,但是使用myInstantiation的代码将其视为属性访问。(这是方便的,但在某些方面误导。)

Object.defineProperty仅适用于支持ECMAScript5新特性的JavaScript引擎,因此不支持IE。如果没有显式的函数调用,就没有标准的方法来做你正在做的事情(Mozilla在标准之前已经做了他们自己的事情,但现在已经弃用了,只在几个浏览器中工作)。


你的代码有一些问题,我应该我应该指出来:

  1. 你没有声明你的变量,所以你成为了隐式全局变量的恐怖的牺牲品。

  2. 您的myFunc定义为:

    myFunc = function() {
        return { val: myVar };
    };
    

    …然后用new:

    调用它
    myInstantiation = new myFunc();
    

    因为你的函数返回一个对象,new在这里不起作用,你可以只做

    myInstantiation = myFunc();
    

    这是因为new的工作方式:它创建一个对象,用myFunc.prototype的原型初始化该对象,然后调用myFunc并将this设置为新对象。如果myFunc不返回任何东西或返回一个原始类型(或null),则new表达式的结果是new创建的新对象。但是,如果myFunc返回一个对象(就像您的对象一样),则由new创建的新对象将被丢弃,而使用您的对象。所以new与你的功能是无关的。

在JavaScript中,某些类型通过值传递,而其他类型通过引用传递。特别是,整数和其他基本类型是按值传递的,因此不能直接检索指向它们的指针。

然而,如果你使用Integer构造函数(我不记得JavaScript有一个标准的构造函数),它包装了原始整数,你可以传递一个指向Integer对象的指针。这将允许通过指针更新值。

自从我使用JavaScript已经有一段时间了,所以我不确定下一个想法是否可行。当实例化一个新函数时,该函数关闭当前在作用域中的变量。这意味着您应该能够执行如下操作:

myInstantiation = new myFunc(new function(newValue) { myVar = newValue } );

可以在myFunc中使用。(语法可能有点不对劲,但我认为这个想法应该行得通。就像我说的,我真的不再做JavaScript了)。

编辑

所以,是的,就你的问题而言,最后一部分毫无意义——我把情况搞反了。但是,您可以使用双重函数:

myInstantiation = new myFunc(new function() { return myVar } );

通过调用给定的函数而不是直接使用myVar,更改应该从myFunc中可见。如果您喜欢简单的双向通信,您可以使用前面的函数和这个新函数来从myFunc中获取/设置myVar