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