有没有办法在javascript对象中代理变量?

时间:2013-08-18 04:38:08

标签: javascript

鉴于我正在使用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都提供了扩展方法,但它们似乎将内容复制到原始对象中。我也考虑了飞行重量模式(我认为这种模式有点矫枉过正,我会发现与上面相同的观点)。

2 个答案:

答案 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 
    }
}