1

鉴于我正在使用 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.

理想情况下,我宁愿 type myCar.company,而不是myCar.type.companyClass 的一致性。

我知道 underscore 和 jQuery 都提供扩展方法,但它们似乎将内容复制到原始对象中。我还考虑了飞行重量模式(我认为这是矫枉过正,我会遇到与上述相同的症结)。

4

2 回答 2

2

您可以使用defineProperty,它支持为属性定义 get/set 方法等。

引用的 MDN 文章也有一个兼容性表,但它在所有浏览器的最新版本中普遍支持,但有一些限制。

既然您提到了 John Resig,他有一篇不错的博文“ ECMAScript 5 Objects and Properties ”,虽然有点老,但仍然值得一读。它写于 2009 年 5 月,他在帖子的开头就指出,一些示例和规范可能会发生变化。

于 2013-08-18T04:44:03.027 回答
1

是的。使用 ES6 Proxy(),您可以为属性获取和设置事件创建陷阱。

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 
    }
}
于 2018-11-03T07:54:19.350 回答