好吧,我试图弄清楚这有可能以任何方式.这是代码:
a=function(text)
{
var b=text;
if (!arguments.callee.prototype.get)
arguments.callee.prototype.get=function()
{
return b;
}
else
alert('already created!');
}
var c=new a("test"); // creates prototype instance of getter
var d=new a("ojoj"); // alerts already created
alert(c.get()) // alerts test
alert(d.get()) // alerts test from context of creating prototype function :(
Run Code Online (Sandbox Code Playgroud)
如你所见,我试图创建原型getter.为了什么?好吧,如果你写这样的东西:
a=function(text)
{
var b=text;
this.getText=function(){ return b}
}
Run Code Online (Sandbox Code Playgroud)
......一切都应该没问题......但实际上每次创建对象时 - 我都会创建使用内存的getText函数.我想在记忆中有一个原型功能可以做同样的事情...任何想法?
编辑:
我试过Christoph给出的解决方案,它似乎是目前唯一已知的解决方案.它需要记住id信息以从上下文中检索值,但是整个想法对我来说很好:) Id只是要记住的一件事,其他一切都可以在内存中存储一次.实际上,您可以通过这种方式存储许多私有成员,并且只能使用一个id.实际上这让我很满意:)(除非有人有更好的主意).
someFunc = function()
{
var store = new Array();
var guid=0;
var someFunc = function(text)
{
this.__guid=guid;
store[guid++]=text; …
Run Code Online (Sandbox Code Playgroud) 基本上这是一个如何访问本地范围处理程序的问题.我试图为全局变量定义实现类似的东西,如:
window['newObject'] = "some string";
alert(newObject);
Run Code Online (Sandbox Code Playgroud)
但对于当地范围.现在我只有解决方案是使用evals:
eval("var newObject='some string'");
Run Code Online (Sandbox Code Playgroud)
但这是一个非常丑陋的解决方案......最好的方法就是在window []解决方案中使用一些本地范围的引用,但我从来没有听说过任何对本地范围的引用......有什么想法吗?
示例如下:
function x(arg)
{
localScope[arg.name]=arg.value;
alert(sex);
}
x({name:"sex", value:"Male"});
Run Code Online (Sandbox Code Playgroud) 昨天我发现了这个功能:
function clone(obj) {
return typeof obj === 'undefined' ?
this : (clone.prototype = Object(obj), new clone);
}
Run Code Online (Sandbox Code Playgroud)
我虽然在Javascript中看到了很多,但这种语法对我来说不得而知:
clone.prototype = Object(obj), new clone
Run Code Online (Sandbox Code Playgroud)
谁能解释我怎么读这个?你能给我链接到正确的定义吗?我在Mozilla的MDC中找不到它,也不知道如何在网上找到它,但这是我第一次看到这种语法.感谢您的努力.
最终解决方案
我根据这里的答案做了一些测试,我找到了:
var b;
b=alert('test'),6;
alert(b); // alert undefined
b=5,alert('test2');
alert(b); // alert 5
Run Code Online (Sandbox Code Playgroud)
感谢christoph研究我们发现了更多:
var a, b, c;
a = 1, 2; // a is 1
(b = 1), 2; // b is 1 - same as above!
c = (1, 2); // c is 2
Run Code Online (Sandbox Code Playgroud)
啊,我也在IE6上测试它,它的工作原理,所以这必须是旧的语法,没有关于它的信息?:(奇怪......
你们两个都给了很好的解决方案,感谢这里的解决方案!