Javascript原型,通过不同函数调用时使用
我正在使用多个原型来管理一些复杂的情况,我在使用“this”时遇到了麻烦。我不是100%确定如何描述,因为我不熟悉正确的术语,但我会试试 函数X有一个指向函数Y内函数的变量。函数Y内的此方法希望访问函数Y范围内的变量,但当我使用此方法时,它指的是函数X 我创建了一个示例,使用原型等等(这就是我发现自己所处的场景)。但是代码很短,因此我将在下面介绍:Javascript原型,通过不同函数调用时使用,javascript,function,this,prototype,Javascript,Function,This,Prototype,我正在使用多个原型来管理一些复杂的情况,我在使用“this”时遇到了麻烦。我不是100%确定如何描述,因为我不熟悉正确的术语,但我会试试 函数X有一个指向函数Y内函数的变量。函数Y内的此方法希望访问函数Y范围内的变量,但当我使用此方法时,它指的是函数X 我创建了一个示例,使用原型等等(这就是我发现自己所处的场景)。但是代码很短,因此我将在下面介绍: var Abc = function(options) { alert('2'); options = options || {};
var Abc = function(options) {
alert('2');
options = options || {};
this.myVar = options.myVar || 'Abc.myVar';
};
Abc.prototype = {
onEvent: function() {
alert('myVar: ' + this.myVar);
}
};
var Xyz = function(options) {
alert('3');
options = options || {};
this.listenFn = options.listenFn || function() {
alert('x');
};
this.myVar = options.myVar || 'Xyz.myVar';
};
Xyz.prototype = {
execute: function() {
alert('4');
this.listenFn();
}
};
$(document).ready(function(){
alert('1');
var a = new Abc();
var x = new Xyz({listenFn: a.onEvent});
x.execute();
});
我已经在代码执行的顺序中加入了警报。因此:
$(document).ready(function(){
alert('1');
var a = new Abc();
var x = new Xyz({listenFn: a.onEvent.bind(a) }); // <------- bind
x.execute();
});
在不深入研究代码的情况下,我只想说:在JavaScript中找出
this
的值非常容易;这完全取决于调用函数的方式
- 如果您有
,那么无论发生什么*,x.foo()
将等于foo内部的此
x
- 如果您有
,那么无论发生什么*,foo()
都将是全局对象,或者在foo内部的严格模式中未定义此
- 如果你说
,那么new foo()
这将是一个新对象,其原型将设置为
foo.prototype
- 如果你说
,那么foo.call(a)
将是foo内部的这个
*,但这在这里并不适用a
var foo = function() { }.bind(obj);
然后,您已经将所有foo调用的
this
预先绑定为obj
,并将覆盖上述规则 那么,当在Abc prorotype上执行从Zyz prorotype上的函数调用的函数时,是否有一种简单的方法来访问Abc实例的myVar?我怀疑我必须将Abc实例作为参数包含在内,但我希望避免这种情况。@Metalskin-不确定-我在您的代码中没有看到这种情况。如果您有Abc.prototype.foo=function(){var X=new Xyz();}
,那么您当然可以说X.myVar。这就是你的意思吗?不完全是亚当。问题是foo1.prototype有一个“listener”函数。对于给定的foo1实例,该方法被分配给foo2。Foo2调用此方法,因此当foo1.prorotype中定义的方法正在执行时,它引用的是Foo2的实例,而不是foo1。在这种情况下,我需要知道如何访问作用域为foo1的vars。如果您运行JSFiddle,您将看到this.myVar的值是针对foo2实例的,而不是针对foo1实例的。它比另一个更整洁,并且阻止我改变Xyz。我希望只改变函数本身的内部结构,但这会起作用。再次感谢:-)我将使用第二种方法,它更有意义,现在我明白人们为什么这么做了@Metalskin-我的荣幸-很高兴能帮忙!:)
var foo = function() { }.bind(obj);