Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在使用构造函数进行原型设计时,如何访问实例?_Javascript_Oop_Constructor_Prototype - Fatal编程技术网

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:此的语义有太多方面。一个人可以说得太少,留下漏洞,或者说得太多,然后就消失了