Javascript 如何访问父对象的属性?

Javascript 如何访问父对象的属性?,javascript,Javascript,请帮忙解决这个问题 我制作了3个物体: 级别: var Level = function() { self = this; this.cellsObserver = new CellsObserver(); console.log('co from level ' + this.cellsObserver); this.fieldObj = new Field(); } 字段: var Field = function() { self = this; this.i

请帮忙解决这个问题

我制作了3个物体:

级别:

var Level = function() { 
  self = this;
  this.cellsObserver = new CellsObserver();
  console.log('co from level ' + this.cellsObserver);
  this.fieldObj = new Field();
}
字段:

var Field = function() { 
  self = this;
  this.init();
};

Field.prototype = Object.create(Level.prototype);

Field.prototype = {
  init: function() {
    console.log('co from field ' + self.cellsObserver);
  } 
 } 
观察员:

var CellsObserver = function(){
  .............
}
结果控制台输出如下:

来自级别[对象对象]未定义来自字段的co

我不明白为什么在第二种情况下输出为“未定义”。因为我已经任命了一位家长:

Field.prototype = Object.create(Level.prototype);

您正在覆盖
字段。prototype
。只需分配给
字段.prototype.init
tl;dr:field或Level.prototype对象中都没有field Cells服务器。而且Javascript中没有经典的“自我”这类东西

说来话长。

当您试图获取
对象.property
时,Javascript将查看试图查找
属性的对象,然后查看
对象.prototype
(另一个对象)等,直到它到达
对象.prototype
引用中的空原型

因此,当您第二次调用级别构造函数中的
this.cellsObserver
时,它是这样的:
this
是一个新构造的对象(如果使用
new
关键字调用它),并且属性列表中有
cellsObserver
,因此将在不进行任何深入查找的情况下获取它

那么

这只意味着
Field.prototype
现在将引用一个新对象,该对象的属性与
Level.prototype
中的属性相同。 根据您的代码,
Level.prototype
对象中没有非标准属性(您没有提供任何属性)

那么

在这里,您只需为刚刚创建的对象或窗口对象()分配一个名为
self
的全局变量。如果希望存储对
this
对象的引用,则应
var
var self=this
。但是您应该记住,这个
self
变量只能在声明的范围内或在闭包中访问

那么

首先,这里您只需重写previos指令(
Field.prototype=Object.create(Level.prototype);
)。如果要扩展
字段.prototype
对象,可以在
对象.create
调用中执行,或者只需访问如下属性:
Field.prototype.init=function(){…}

第二。当执行
init
函数时,
self
变量可以包含任何内容。只需对此处的当前对象使用
this

第三,。让我们试着猜测当
this.cellsObserver
init
函数中进行计算时会发生什么

这个
对象引用的是
字段
实例,那里没有
cellsObserver
属性,所以我们移动到
字段。prototype
对象,上面定义了(
{init:function(){…}}
),也没有
cellsObserver
,所以我们转到
对象.prototype
对象,它是
null
。好的,我们的查找失败,
此.cellsObserver
未定义

如果
Field.prototype=Object.create(Level.prototype)
没有被以下代码覆盖,会是什么样子?
对象将尽早引用字段实例。Field.prototype指的是
级别.prototype
对象的副本,这里也没有
cellsObserver
。所以,我们看一下
对象.prototype
,就这样。在任何对象中都没有
cellsObserver
,但在级别类的实例中除外,该类在
字段
实例中未以任何方式引用

你可以在这里玩:通过粘贴以下代码:

var Level = function() {
  this.cellsObserver = new CellsObserver();
  this.fieldObj = new Field();
}

var Field = function() {
  this.init();
};

Field.prototype = Object.create(Level.prototype);

Field.prototype.init = function() {};

this.field = new Field();

很明显,您不理解原型继承(以及其他一些JavaScript概念)。我建议你读一些教程。
self = this;
Field.prototype = {
  init: function() {
    console.log('co from field ' + self.cellsObserver);
  } 
 } 
var Level = function() {
  this.cellsObserver = new CellsObserver();
  this.fieldObj = new Field();
}

var Field = function() {
  this.init();
};

Field.prototype = Object.create(Level.prototype);

Field.prototype.init = function() {};

this.field = new Field();