如何给出指向对象新实例化的指针
How do I give a pointer to a new instantiation of an object?
请看下面的一段简化代码:
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在标准之前已经做了他们自己的事情,但现在已经弃用了,只在几个浏览器中工作)。
你的代码有一些问题,我应该我应该指出来:
你没有声明你的变量,所以你成为了隐式全局变量的恐怖的牺牲品。
您的
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
。
- 如何在GoogleWeb工具包(GWT)中从JSNI调用接口(实例化)
- 如何在用户输入时实例化数组
- 在requirejs中共享实例化对象
- Mongoose TypeError:实例化模式类型的对象时,对象不是函数
- Angular重命名模块后未能实例化模块
- Backbone relational无法实例化两个RelationalModel对象
- 我应该如何用javascript实例化这个日期
- AngularJS出错-无法实例化模块
- 谷歌地图重叠MarkerSpiderfier实例化问题
- 未捕获错误:由于,[$injector:moduler]未能实例化模块polmgr
- ngRoute不是因果报应实例化的
- JavaScript 中的动态实例化
- 在文本框上绑定谷歌地点自动完成,而无需实例化谷歌地图
- UI5 路由不实例化视图
- 在 JavaScript 中,当我们实例化派生对象时,原型的函数隐藏在哪里
- 仅在需要时实例化聚合物元素
- 角度 JS 控制器未实例化
- 如何理解“当类实例化时,JavaScript静态方法也是不可调用的”
- 在 Typescript 中实例化对象,遵循松散耦合
- 如何给出指向对象新实例化的指针