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

Defining Javascript's object property by invoking function

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

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

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

是否有直接在对象上定义特性和特性的系统方法?我知道你可以在 defineProperty 里面做 set: 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);,
}

Why can't I just use an iffe inside object.defineProperty ?

您可以用 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 属性 是一种方法,而不是静态 属性.