以 JavaScript 对象文字表示法设置函数的属性

Setting properties on functions in JavaScript object literal notation

本文关键字:设置 函数 属性 表示 JavaScript 对象 文字      更新时间:2023-09-26
var api = {};
api.c = function () {return 1};
api.c.m = function () {return 2};
alert(api.c()); // returns 1
alert(api.c.m()); // returns 2
var api2 = {
    c: function () {}; // can't put m inside c in object literal notation
};

我们如何在对象文字符号中将 m 嵌入 c 中?

你不能。但是,你可以做

Object.defineProperty(api.c, 'm', { value: function() { return 2; } });

由于Object.defineProperty返回对象,因此您可以这样做

var api = {
    c: Object.defineProperty(function() { }, 'm', {
        value: function() { return 2; }
    })
};

或者对于多个属性:

var api = {
    c: Object.defineProperties(function() { }, {
        m: { value: function() { return 2; } },
        ...
    })
};

这可能最接近于满足您以对象文字形式编写函数属性的愿望。

或者,您可以使用大多数框架(或 ES6 中Object.assign(中提供的extend功能:

var api = {
    c: Object.assign(function() { }, {
        m: function() { return 2; }
    )
};

随意将Object.assign替换为$.extend_.extend等。

根据你对丑陋的容忍度,你可以尝试以下方法,这是@zerkms提案的变体,没有IIFE(你需要一个可变的x(:

var api = {
    c: (x = function() { }, x.m = function() { return 2; }, x)
};

从技术上讲这是可能的,但它很丑陋

var api2 = {
    c: (function() {
        var f = function() {};
        f.m = 'something else';
        return f;
    }())
};

所以我个人认为没有充分的理由这样做,而不是在第一种情况下你如何做。