在C++中,我最熟悉的语言,通常是一个声明这样的对象:
class foo
{
public:
int bar;
int getBar() { return bar; }
}
Run Code Online (Sandbox Code Playgroud)
调用getBar()工作正常(忽略bar可能未初始化的事实).内部的变量bar在getBar()类的范围内foo,所以我不需要说,this->bar除非我真的需要说清楚我指的是' bar而不是比如参数.
现在,我正试图在Javascript中开始使用OOP.所以,我查找如何定义类并尝试相同的事情:
function foo()
{
this.bar = 0;
this.getBar = function() { return bar; }
}
Run Code Online (Sandbox Code Playgroud)
它给了我bar is undefined.更改bar以this.bar解决问题,但为每个变量执行此操作会使我的代码变得非常混乱.这对每个变量都是必要的吗?由于我找不到与此有关的任何问题,这让我觉得我做的事情从根本上是错误的.
编辑:是的,所以,从评论我得到的是,this.bar一个对象的属性,引用不同于bar局部变量的东西.有人可以说,为什么这就是范围和对象,以及是否有另一种方法来定义一个没有必要的对象?
我有一个JavaScript函数对象;
var addNum = function(num1, num2) {
return num1 + num2;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试访问
addNum.divide()
Run Code Online (Sandbox Code Playgroud)
我想了解上述代码的原型链.我读到在上面的例子中,addNum将被搜索divide(),然后是Function.prototype,最后是Object.prototype.
但我的问题是在上面的例子中,addNum如何搜索divide()
它是指类似的东西吗?
var addNum = function(num1, num2) {
this.divide = function(){}
return num1 + num2;
}
Run Code Online (Sandbox Code Playgroud)
我无法理解addNum将被搜索为divide()的行
请帮我理解一下.
我收到一个类似于此的文档的ajax feed(非常简化):
aDocs = [{title:'new doc', ext:'pdf'}, {title:'another', ext:'xlsx'}];
Run Code Online (Sandbox Code Playgroud)
我将遍历aDocs数组并显示有关每个文档的信息,同时向每个文档添加一些方法,这些方法将允许修改HTML以进行显示并进行API调用以更新数据库.
我在这里读到,为了向现有对象添加方法,您可以使用该__proto__属性.有点像:
function Doc(){}
Doc.prototype.getExt = function(){return this.ext}
Doc.prototype.getTitle = function(){return this.title}
for (var i=0; i<aDocs.length; i++){
aDocs[i].__proto__ = Doc.prototype
}
Run Code Online (Sandbox Code Playgroud)
根据上面的那篇文章,这不是官方的javascript,IE不支持(永远不会),并且很可能在webkit浏览器中被弃用.
这是另一种选择:
function getExt(){ return this.ext }
function getTitle(){return this.title}
for (var i=0; i<aDocs.length; i++){
aDocs[i].getExt = getExt;
aDocs[i].getTitle = getTitle;
}
Run Code Online (Sandbox Code Playgroud)
这第二种选择是否可行且有效?或者我是否重新创建这些功能,从而产生多余的开销?
再次简化上面的例子(我知道aDocs[i].ext将解决上面的问题,但我的显示和API调用方法更复杂).
如果我执行以下操作(在全局范围内):
var myObject = {name: "Bob"};
Run Code Online (Sandbox Code Playgroud)
我有办法在内存中指向该对象(即字符串标识符"myObject)".我可以打开控制台并输入:myObject.name控制台将响应:
"Bob"
Run Code Online (Sandbox Code Playgroud)
现在,如果我输入:
{name: "Jane"};
Run Code Online (Sandbox Code Playgroud)
我正在某个地方创造那个物体,我猜它继续生活在某个范围内.有什么方法可以找到它吗?它是否存在window于某些通用商店的某个地方?
编辑:有人说它只会收集垃圾.
那么这个例子怎么样:
var MyObject = function(){
$("button").click(this.alert);
}
MyObject.prototype.alert = function(){
alert("I heard that!")
}
new MyObject();
Run Code Online (Sandbox Code Playgroud)
它不能被垃圾收集,因为它的回调绑定到DOM事件.生成的对象在哪里存在并且可以访问它?