【问题标题】:JavaScript - object "this"JavaScript - 对象“this”
【发布时间】:2014-11-19 10:53:08
【问题描述】:

我有两个 JavaScript 对象。

  • Obj1 - 静态类
  • Obj2 - 实例

在 Obj1 中添加项目并从 Obj2 运行方法 isAdded() 后出现问题。

obj1.func 存储一个函数,其中包含用于 Obj2 的关键字 this。如果我打电话给 Obj1.func([args]) this 现在是 Obj1 而不是 Obj2。

有什么答案吗?

var Obj1=function(){};
Obj1.func=null;
Obj1.addItem=function(vstup){
    //    code for add - AJAX async ....

    //    after adding
    Obj1.func(id, nazev);
};

//    ----------------------------

var Obj2=function(){
    this.variable=null;
    this.promenna2=null;

    this.isAdded=function(){
        this.variable="added";
        alert("ok");
    };
};

//    ---------------------
//    in body

window.onload=function(){
    var instanceObj2=new Obj2();
    obj1.func=instanceObj2.isAdded();
    obj1.addItem("test");
}

【问题讨论】:

  • Obj1 - 静态类 Obj2 - 实例... 英文
  • 我完全迷路了。哪条线路给你带来了问题?
  • 我看到的唯一this 是用于OBJ2。

标签: javascript object


【解决方案1】:

你正在做obj1.func = instanceObj2.isAdded(),这意味着:setobj1.functo the result ofinstanceObj2.isAdded(),即:obj1.func = undefined,因为obj2.isAdded()返回什么都没有。

如果您随后执行运行Obj1.funcobj1.isAdded(),则实际上您将undefined 作为函数执行。

修复它:

obj1.func = function() { instanceObj2.isAdded(); };

在另一个上下文中调用某事(又名:运行某事并设置“this”)

要运行具有不同 this 值的东西:

要设置函数的上下文,您可以使用 applycall

function add()
{
    var result = this;
    for(var i = 0, l = arguments.length; i < l; i++)
        result += arguments[i];
    return result;
}
var value = 2;
newValue = add.apply(value, [3,4,5]); // = 2 + 3 + 4 + 5;
// newValue = 5
newValue = add.call(value, 3, 4, 5) // same as add.apply, except apply takes an array.

创建一个带有上下文的新函数

在新浏览器 (ie9+) 中,可以使用 Function.prototype.bind 来创建带有设置上下文 (this) 的回调并设置在其他参数之前的参数。

callback = func.bind(object);
callback = function() { func.apply(object, arguments); }

callback = func.bind(object, 1, 2);
callback = function() { func.apply(object, [1, 2]); };

【讨论】:

  • +1,或在现代浏览器上(或使用 polyfill):obj1.func = instanceObj2.isAdded.bind(instanceObj2);
  • @T.J.Crowder 这就是为什么我喜欢这样:总是学习新的东西:-),我会把它添加到我的答案中!
  • obj1.func = instanceObj2.isAdded; :)
  • @Shomz:不,this 会搞砸,isAdded 确实依赖于this
  • @Shomz 如果您运行obj1.func(),那么this 将引用obj1 而不是isntanceObj2。这就是区别。如果这么简单,他们为什么要介绍 Function.prototype.bind ? ;-)
【解决方案2】:

在javascript中this指的是当前正在使用的元素,所以它的引用不断变化 最好的方法是将 (this) 存储在一个变量中。并在你想要的地方使用它。

喜欢

var obj1This=this;
var obj2This=this;

以后使用它们

obj2This.isAdded();

【讨论】:

  • 为什么将“this”术语保留在不合适的变量中?
猜你喜欢
  • 2015-01-22
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2013-08-10
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多