使用属性回退嵌套相同类型的JavaScript对象?

使用属性回退嵌套相同类型的JavaScript对象?,javascript,inheritance,Javascript,Inheritance,我正在寻找一种方法来创建具有属性后备功能的相同类型的嵌套js对象 我希望能够写,例如: 如果这个对象没有这个属性(未定义),那么它应该在基本状态等中查找,直到不再存在基本状态,然后返回未定义 对于基态,我指的是这个状态所基于的其他一些状态,而不是像类继承那样被继承 我想上这样的课: function State(base) { this.base = base; // also a state } 当我试图从基于另一个状态B的状态a获取属性p时,状态a没有定义属性p,它应该在状态B中查

我正在寻找一种方法来创建具有属性后备功能的相同类型的嵌套js对象

我希望能够写,例如:

如果这个对象没有这个属性(未定义),那么它应该在基本状态等中查找,直到不再存在基本状态,然后返回未定义

对于基态,我指的是这个状态所基于的其他一些状态,而不是像类继承那样被继承

我想上这样的课:

function State(base) {
    this.base = base; // also a state
}
当我试图从基于另一个状态B的状态a获取属性p时,状态a没有定义属性p,它应该在状态B中查找

我知道我可以使用state.getState(key)这样的函数,它首先查看自己的属性,然后查看基本属性。但是我正在寻找一种方法,用普通属性来代替

在C#中,它看起来是这样的(如果使它成为一个动态对象,我会得到与javascript中相同的ducked类型状态):


这是CoffeeScript用于类扩展的内容(使用原型继承):

这假设类函数都是类函数原型的一部分


例如:

Animal = (function() {

  function Animal() {}

  Animal.prototype.name = 'Generic Animal';

  Animal.prototype.my_sound = 'none';

  Animal.prototype.sound = function() {
    return console.log(this.my_sound);
  };

  return Animal;

})();

Cow = (function(_super) {

  __extends(Cow, _super);

  function Cow() {
    return Cow.__super__.constructor.apply(this, arguments);
  }

  Cow.prototype.name = 'Cow';

  Cow.prototype.my_sound = 'Moo';

  return Cow;

})(Animal);

Cat = (function(_super) {

  __extends(Cat, _super);

  function Cat() {
    return Cat.__super__.constructor.apply(this, arguments);
  }

  Cat.prototype.name = 'Cat';

  Cat.prototype.my_sound = 'Meow';

  return Cat;

})(Animal);

这是CoffeeScript用于类扩展的内容(使用原型继承):

这假设类函数都是类函数原型的一部分


例如:

Animal = (function() {

  function Animal() {}

  Animal.prototype.name = 'Generic Animal';

  Animal.prototype.my_sound = 'none';

  Animal.prototype.sound = function() {
    return console.log(this.my_sound);
  };

  return Animal;

})();

Cow = (function(_super) {

  __extends(Cow, _super);

  function Cow() {
    return Cow.__super__.constructor.apply(this, arguments);
  }

  Cow.prototype.name = 'Cow';

  Cow.prototype.my_sound = 'Moo';

  return Cow;

})(Animal);

Cat = (function(_super) {

  __extends(Cat, _super);

  function Cat() {
    return Cat.__super__.constructor.apply(this, arguments);
  }

  Cat.prototype.name = 'Cat';

  Cat.prototype.my_sound = 'Meow';

  return Cat;

})(Animal);

不确定这是否是您想要的,但可能是:

var state1 = {a : 1};
var state2 = Object.create(state1);
state2.b = 2;
console.log(state2.a); // 1
var state3 = Object.create(state2);
state3.a = 10; // creates an own "a" in state3
console.log(state1.a); // 1
console.log(state2.a); // 1
console.log(state3.b); // 2
正如我在对您的问题的最初评论中所建议的,这是使用继承
Object.create
返回一个新对象,该对象使用作为第一个参数传递的对象作为其[[Prototype]](某些实现通过
\uuuuuuuuu proto\uuuuu
属性公开)。当您尝试访问新对象的属性而未找到自己的属性时,它会在原型链中查找


较旧的浏览器不支持创建对象,但可以使用非常简单的多边形填充。

不确定这是否是您想要的,但可能是:

var state1 = {a : 1};
var state2 = Object.create(state1);
state2.b = 2;
console.log(state2.a); // 1
var state3 = Object.create(state2);
state3.a = 10; // creates an own "a" in state3
console.log(state1.a); // 1
console.log(state2.a); // 1
console.log(state3.b); // 2
正如我在对您的问题的最初评论中所建议的,这是使用继承
Object.create
返回一个新对象,该对象使用作为第一个参数传递的对象作为其[[Prototype]](某些实现通过
\uuuuuuuuu proto\uuuuu
属性公开)。当您尝试访问新对象的属性而未找到自己的属性时,它会在原型链中查找


Object.create
不受旧浏览器支持,但有一个非常简单的多边形填充可用。

为什么不继承?原型继承似乎正是您所寻找的。我不能用预定义的继承链拥有不同的状态类。为什么不继承呢?原型继承似乎正是您所寻找的。我不能用预定义的继承链拥有不同的状态类。请耐心等待!=)我不是在寻找如何进行protype继承。我正在寻找如何嵌套js对象并使用父属性作为在被调用对象中找不到的属性的后备。@AndreasZita这正是原型继承可以完成的事情之一。:)嗯,也许你是对的。我对js了解不多。但是,在创建状态并嵌套它们之前,我不能拥有具有已定义继承的状态类。我的意思是我将在运行时创建状态并连接/断开它们。。。我必须进一步调查这件事(=)试过了,但运气不好。不确定我是否用对了。当修改父状态时,子状态仍然具有旧值。@AndreasZita
\uuu extends
不适用于对象。。。这是给原型的,你的马!=)我不是在寻找如何进行protype继承。我正在寻找如何嵌套js对象并使用父属性作为在被调用对象中找不到的属性的后备。@AndreasZita这正是原型继承可以完成的事情之一。:)嗯,也许你是对的。我对js了解不多。但是,在创建状态并嵌套它们之前,我不能拥有具有已定义继承的状态类。我的意思是我将在运行时创建状态并连接/断开它们。。。我必须进一步调查这件事(=)试过了,但运气不好。不确定我是否用对了。当修改父状态时,子状态仍然具有旧值。@AndreasZita
\uuu extends
不适用于对象。。。这是原型汉克斯的!这正是我要找的。另一个方法(_extends)似乎复制了属性值,因此不可能修改父状态并在子状态中反映if。但用这种方法,效果很好。我可以更改state1.a并让state2.a返回相同的新值。谢谢!这正是我要找的。另一个方法(_extends)似乎复制了属性值,因此不可能修改父状态并在子状态中反映if。但用这种方法,效果很好。我可以更改state1.a并让state2.a返回相同的新值。
var state1 = {a : 1};
var state2 = Object.create(state1);
state2.b = 2;
console.log(state2.a); // 1
var state3 = Object.create(state2);
state3.a = 10; // creates an own "a" in state3
console.log(state1.a); // 1
console.log(state2.a); // 1
console.log(state3.b); // 2