我正在努力理解javascript中的函数和对象.据说,函数也是对象,对象是一种"关联数组",即键值对的集合.我明白,如果我写
function myFunction() {
var value = 0;
}
alert(myFunction.value); //then this gives me "undefined"
Run Code Online (Sandbox Code Playgroud)
因为变量有功能范围.但如果我写
function myFunction() {
this.value = 0;
}
alert(myFunction.value); //then this gives me "undefined" too.
Run Code Online (Sandbox Code Playgroud)
但最后,如果我写
function myFunction() {
this.value = 0;
}
myFunction.value = 0;
alert(myFunction.value); //then this gives me 0
Run Code Online (Sandbox Code Playgroud)
所以我可以给myFunction属性"value"但是来自"outside".有人可以解释发生了什么以及为什么this.value = 0; 不会创造属性"价值".
在我的C++代码中,我有一个类Object,它配有int类型的id字段.现在我想创建一个Object*类型的指针向量.首先我试过了
vector<Object*> v;
for(int id=0; id<n; id++) {
Object ob = Object(id);
v.push_back(&ob);
}
Run Code Online (Sandbox Code Playgroud)
但这失败了,因为这里同一个地址只重复了n次.如果我使用new运算符,我会得到我想要的但我想避免动态内存分配.然后我认为我需要的是以某种方式在for循环之前声明n个不同的指针.直截了当的方式是声明一个数组,所以我这样做:
vector<Object*> v;
Object ar[n];
for(int i=0; i<n; i++) {
ar[i] = Object(i);
}
for(int i=0; i<n; i++) {
v.push_back(ar+i);
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,是否还有可能导致内存泄漏?在我看来,通过数组声明也有点笨拙.有没有其他方法来创建指针向量但避免手动内存管理?
编辑:为什么我想要指针而不仅仅是普通对象?
好吧,我稍微修改了原来的实际情况,因为我以这种方式思考,我可以用最简单的形式表示问题.无论如何,我仍然认为这个问题可以在不知道为什么我需要一个指针向量的情况下得到解答.
其实我有
Class A {
protected:
vector<Superobject*> vec;
...
};
Class B: public A {...};
Class Superobject {
protected:
int id;
...
}
Class Object: public Superobject {...}
Run Code Online (Sandbox Code Playgroud)
在派生类中,B我想用成员vec类型的对象填充成员字段Object.如果超类没有使用指针,我会遇到对象切片问题.所以在类B构造函数中我想初始化vec为类型指针的向量Object*.
EDIT2
是的,在我看来,动态分配是合理的选择,使用数组的想法是个坏主意.当数组超出范围时,事情就会出错,因为向量中的指针指向不一定包含对象的内存位置. …
我正在从Crockford的书Javascript:The Good Parts学习javascript.他解释了如何使用闭包来封装信息.例如
var myObject = (function () {
var value = 0;
return {
getValue: function () {
return value;
}
};
}());
Run Code Online (Sandbox Code Playgroud)
如果我正确理解了这一点,我们的想法是定义一个返回对象文字的函数.然后调用此函数以初始化myObject.但是最外面的括号是什么意思?[(f ...);].对()是否足以调用我们定义的函数?