Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/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_Inheritance - Fatal编程技术网

Javascript 从父函数访问实例变量

Javascript 从父函数访问实例变量,javascript,inheritance,Javascript,Inheritance,我有一个从另一个继承的对象。在子对象中,我初始化了一些实例变量。在父对象中,我有一个方法调用使用这些实例变量的私有函数 function objA() { this.funcA = function() { alert(this.var); funcB(); }; function funcB() { alert(this.var); }; } objB.prototype = new objA(); objB.prototype.constructor

我有一个从另一个继承的对象。在子对象中,我初始化了一些实例变量。在父对象中,我有一个方法调用使用这些实例变量的私有函数

function objA() {
  this.funcA = function() {
    alert(this.var);
    funcB();
  };
  function funcB() {
    alert(this.var);
  };
}

objB.prototype = new objA();
objB.prototype.constructor = objB;
function objB() {
  this.var ="hello";
  this.funcA();
}
第一个警报显示“你好”,第二个警报未定义

我知道javascript中的“this”是调用函数的对象的标识,而不是实例本身。。。我假设在调用funcB时,我处于某种父上下文中,变量不存在

我是一个纯javascript新手,我不知道如何解决这个问题。当然,我可以把它作为一个变量传递,但它不是很面向对象的,在我的项目中,有很多变量可以使用


感谢使用基于原型的继承,您无法从父级访问子级中声明的属性。请参阅Mozilla的开发者指南:

特别是它说:

“属性查找遵循原型链。共享公共原型链的所有对象都共享公共属性。”


子对象与父对象共享整个“公共原型链”,但不是相反。这并不意味着可能没有其他方法来完成您正在尝试的任务,但是,基于原型的继承可能不是这样。

请不要滥用JavaScript在使用函数后定义函数的能力。读这样的代码真的很难

正如您所注意到的,问题不在于继承链,而在于如何从
funcB
函数访问
this
。通过执行
foo()
调用函数与调用
obj.foo()
this.foo()
不同。
的值取决于调用函数的方式。当您执行
obj.foo()
时,这将是
obj
。但是如果调用
foo()
this
的值将是
窗口
对象

您可以通过使用和
function.prototype.apply
在函数内部更改
this
的值,因此编写
foo.call(obj)
(现在
this
将成为
obj
)。考虑到这一点,您的代码将如下所示:

function objA() {
  function funcB() {
    alert(this.var);
  }
  this.funcA = function() {
    alert(this.var);
    funcB.call(this); // <- notice .call()
  };
}

function objB() {
  this.var ="hello";
  this.funcA();
}
objB.prototype = new objA();
objB.prototype.constructor = objB;
函数objA(){
函数funcB(){
警报(this.var);
}
this.funcA=函数(){
警报(this.var);

funcB.call(this);//当调用函数时,如funcB(),函数中的“this”将是窗口对象。因此,通常对对象的实例使用代理变量。下面您可以看到如何执行此操作

function objA() {

  var _this;

  this.super = function(){
    _this = this;  
  }

  this.funcA = function() {
    alert(this.var);
    funcB();
  };

  function funcB() {
    alert(_this.var);
  };
}

objB = function objB() {
  this.super();
  this.var ="hello";
  this.funcA();
}

objB.prototype = new objA();

var b = new objB();

太好了,谢谢你的回答