Javascript 在使用构造函数进行原型设计时,如何访问实例?
我正在通过Javascript 在使用构造函数进行原型设计时,如何访问实例?,javascript,oop,constructor,prototype,Javascript,Oop,Constructor,Prototype,我正在通过prototype方法扩展构造函数类的功能,但是我很难弄清楚如何访问即将成为构造函数类实例的方法 假设我们有以下课程: Bla = function() { this.a = 5; } 很简单。现在,我将用一个非常简单的方法来扩展它 Bla.prototype.f=function(){console.log(“Abdf”)} newbla().f()//记录“预期的Abdf。” 但是,如果我想访问a属性(5),该怎么办?假设我试图像这样扩展构造函数类: Bla.protot
prototype
方法扩展构造函数类的功能,但是我很难弄清楚如何访问即将成为构造函数类实例的方法
假设我们有以下课程:
Bla = function()
{
this.a = 5;
}
很简单。现在,我将用一个非常简单的方法来扩展它
Bla.prototype.f=function(){console.log(“Abdf”)}代码>
newbla().f()//记录“预期的Abdf。”
但是,如果我想访问a
属性(5),该怎么办?假设我试图像这样扩展构造函数类:
Bla.prototype.f2=函数(b){return b*这里是问题所在代码>
显然,使用这个
指的是其他东西。我应该使用什么来代替?使用此
来引用调用该方法的对象
console.log(this.a);
有几种方法可以设置此
的值。一个是,如果函数是作为对象的方法调用的,则它通常指调用函数的对象
Bla = function()
{
this.a = 5;
}
Bla.prototype.f = function(){console.log(this.a)};
var bla = new Bla();
bla.f(); //Logs 5
因此您可以看到,由于f
被调用为Bla
变量引用的Bla
实例的方法,因此f
中的this
的值将被设置为引用相同的对象。使用this
引用该方法的对象
console.log(this.a);
有几种方法可以设置此
的值。一个是,如果函数是作为对象的方法调用的,则它通常指调用函数的对象
Bla = function()
{
this.a = 5;
}
Bla.prototype.f = function(){console.log(this.a)};
var bla = new Bla();
bla.f(); //Logs 5
因此,您可以看到,由于
f
被调用为Bla
变量引用的Bla
实例的方法,因此f
中this
的值将被设置为引用同一对象。使用this
关键字访问任何实例属性或方法<代码>此表示实例。由于a
是实例属性,而prototype
方法是实例方法,因此可以在prototype
中访问它
Bla = function() {
this.a = 5;
};
Bla.prototype.foo = function () {
console.log( this.a );
}
var x = new Bla;
x.foo(); // logs 5
然而,如果我们直接向Bla添加一个方法
Bla.bar = function () {
console.log( this.a ); // ERRORRRRR
}
因为bar不是一个实例(
prototype
)方法。在这种情况下,它是Bla
的静态方法,没有实例,this
引用函数Bla.bar
,在这种情况下没有属性a
使用this
关键字访问任何实例属性或方法<代码>此
表示实例。由于a
是实例属性,而prototype
方法是实例方法,因此可以在prototype
中访问它
Bla = function() {
this.a = 5;
};
Bla.prototype.foo = function () {
console.log( this.a );
}
var x = new Bla;
x.foo(); // logs 5
然而,如果我们直接向Bla添加一个方法
Bla.bar = function () {
console.log( this.a ); // ERRORRRRR
}
因为bar不是一个实例(
prototype
)方法。在这种情况下,它是Bla
的静态方法
,没有实例,此
引用函数Bla.bar
,在这种情况下没有属性a
使用this.a
。很好:嗯,真的吗?好吧,显然,我在控制台中尝试示例时搞砸了。可能重复使用this.a
。很好:嗯,真的吗?显然,我在控制台中尝试示例时弄糟了。特别注意:如果您使用对象方法作为事件处理程序(在其他情况下,但事件处理是最常见的情况),通常会在元素的上下文中调用该方法。即在element.onclick=bla_instance.some_方法中
,而这个
关键字实际上将引用元素,而不是bla_实例
(如果使用jQuery绑定事件也一样)。@Flambino:是的,但我不会说它使用元素的“范围”。作用域是与此非常不同的问题,后者指的是调用上下文。但是,是的,调用上下文没有绑定到原始对象(除非您使用Function.prototype.bind()
创建一个)。您是对的,我的意思是编写“上下文”-修复了我的注释。是的,.bind
(或者$.proxy
,如果您在不支持本机绑定的旧浏览器中使用jQuery)是修复方法。我想我也应该提到这一点:-P@Flambino:此的语义有太多方面。一个人可能说得太少,留下漏洞,或者说得太多,偏离了原点<代码>:)是的,解释这个
很快就会偏离轨道。但我认为事件处理是造成上下文混乱的一个常见原因,所以我想我最好提一下。特别是如果原始问题是因为这一点而产生的。a
似乎不正常:)特别注意:如果您将对象方法用作事件处理程序(在其他情况下,但事件处理是最常见的情况),则通常会在元素的上下文中调用该方法。即在element.onclick=bla_instance.some_方法中
,而这个
关键字实际上将引用元素,而不是bla_实例
(如果使用jQuery绑定事件也一样)。@Flambino:是的,但我不会说它使用元素的“范围”。作用域是与此非常不同的问题,后者指的是调用上下文。但是,是的,调用上下文没有绑定到原始对象(除非您使用Function.prototype.bind()
创建一个)。您是对的,我的意思是编写“上下文”-修复了我的注释。是的,.bind
(或者$.proxy
,如果您在不支持本机绑定的旧浏览器中使用jQuery)是修复方法。我想我也应该提到这一点:-P@Flambino:此的语义有太多方面。一个人可以说得太少,留下漏洞,或者说得太多,然后就消失了