通过调用函数定义Javascript的对象属性

时间:2016-08-05 03:25:19

标签: javascript properties javascript-objects

假设我有一个javascript对象,我想为它定义属性和属性属性。即我想通过函数定义scaleRatio。我该怎么做?

我知道我可以做canvasData.scaleRatio = function(){};

然后定义Object.defineProperty{canvasData, 'scaleRatio', {enumerable: true, configurable: false};

是否有直接在对象上定义属性和属性的系统方法?我知道你可以在defineProperty中设置:function(){}但是我不想做那个额外的步骤canvasData.scaleRatio ='asdf';为什么我不能在object.defineProperty中使用iffe?

更新

我的理由是我想调用setupCanvas并初始化CanvasObject及其所有属性。其中一些属性必须通过调用函数来计算。我还希望能够指定属性属性。我怎样才能系统地做到这一点?

function setupCanvas(chart){
    canvasData = Object.defineProperties({}, {
        scaleRatio: {
                value: function(){
                    console.log('gets here');
                    var ratio = chart.data.datasets[0].data.reduce(function(prev,curr){
                    if (prev > curr){
                        return prev; 
                    }
                    return curr; 
                });
                return $(canvas).outerWidth() / (scaleRatio + 10);      
            },
            enumerable: true,
            configurable: false,
            writable: true
        }
    });
    console.log(canvasData.scaleRatio);,
}

1 个答案:

答案 0 :(得分:1)

  

为什么我不能在object.defineProperty中使用iffe?

您可以使用IIFE代替该值。以下是正确语法的示例:

var canvasData = Object.defineProperties({}, {
    scaleRatio: {
        value: (function(){
            // put whatever logic you want here
            return Math.random();
        })(),
        writable: true,
        configurable: false,
        enumerable: true
    }
});

console.log(canvasData);
console.log(canvasData.scaleRatio);

您在代码示例中显示的value函数不是IIFE - 它只是一个常规函数,因此您创建的scaleRatio属性是一个方法,而不是静态属性。