鉴于我正在使用John Resig的类(在此处找到:Class),有没有办法让javascript对象将其变量代理到另一个对象?
示例:
var Car = Class.extend({
init: function(mileage, color, type) {
this.mileage = mileage;
this.color = color;
this.type = carDatabase[type];
}
));
// This would be loaded in as a datasource, not sitting in global
// space like this.
var carDatabase = {
"Falcon": {
"year": 2013,
"engine": "Inline 8",
"company": "Ford"
},
"Commodore": {
"year": 2012,
"engine": "V8",
"company": "Holden"
},
// etc etc
};
// Using the Car class somewhere:
var myCar = new Car(10000, "blue", "Falcon");
console.log(myCar.color); // blue
console.log(myCar.type.year); // 2013
console.log(myCar.type.company); // Ford
所以考虑到上面的例子,我可以将type
代理转发到Car类本身而不用复制type
的内容。
理想情况下,我宁愿输入myCar.company
,而不是myCar.type.company
来确保类的一致性。
我知道下划线和jQuery都提供了扩展方法,但它们似乎将内容复制到原始对象中。我也考虑了飞行重量模式(我认为这种模式有点矫枉过正,我会发现与上面相同的观点)。
答案 0 :(得分:2)
您可以使用defineProperty,它支持为属性定义get / set方法等。
引用的MDN文章也有一个兼容性表,但所有浏览器的最新版本通常都支持它,但有一些限制。
既然你提到过John Resig,他就有一篇很好的博客文章“ECMAScript 5 Objects and Properties”,这篇文章有点陈旧,但仍然很好读。它是在2009年5月写的,他在帖子的早期就说明了一些例子和规格可能会改变。
答案 1 :(得分:0)
是的。使用ES6 Proxy(),可以为属性get和set事件创建陷阱。
const handler = {
get(object, property) {
if(object.hasOwnProperty(property)){
for(var prop in object[property]){
this[prop] = object[property][prop] //set class instance props
}
}
return object[property]; // don't need to return
}
};
var carDatabaseProxy = new Proxy(carDatabase, handler)
class Car {
constructor(mileage,color,type){
this.mileage = mileage;
this.color = color;
carDatabaseProxy[type]; // just need to get
}
}