相关疑难解决方法(0)

Javascript:我是否需要为对象中的每个变量放置this.var?

在C++中,我最熟悉的语言,通常是一个声明这样的对象:

class foo
{
public:
    int bar;
    int getBar() { return bar; }
}
Run Code Online (Sandbox Code Playgroud)

调用getBar()工作正常(忽略bar可能未初始化的事实).内部的变量bargetBar()类的范围内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.更改barthis.bar解决问题,但为每个变量执行此操作会使我的代码变得非常混乱.这对每个变量都是必要的吗?由于我找不到与此有关的任何问题,这让我觉得我做的事情从根本上是错误的.


编辑:是的,所以,从评论我得到的是,this.bar一个对象的属性,引用不同于bar局部变量的东西.有人可以说,为什么这就是范围和对象,以及是否有另一种方法来定义一个没有必要的对象?

javascript scope this

35
推荐指数
2
解决办法
7800
查看次数

Javascript函数对象的属性

我有一个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()的行

请帮我理解一下.

javascript oop prototype prototypal-inheritance

24
推荐指数
2
解决办法
3万
查看次数

向现有Javascript对象添加方法的最佳方法

我收到一个类似于此的文档的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调用方法更复杂).

javascript prototype

10
推荐指数
1
解决办法
2万
查看次数

Javascript:没有名字的对象会发生什么?

如果我执行以下操作(在全局范围内):

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事件.生成的对象在哪里存在并且可以访问它?

javascript

4
推荐指数
1
解决办法
247
查看次数