簡體   English   中英

以JavaScript對象文字表示法設置函數的屬性

[英]Setting properties on functions in JavaScript object literal notation

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; } },
        ...
    })
};

這可能最接近滿足您以對象文字形式編寫函數屬性的需求。

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

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

隨意用$.extend_.extend . _.extend等替換Object.assign

根據您對丑陋的容忍度,您可以嘗試以下操作,對@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;
    }())
};

因此,我個人認為這樣做的理由不是您在第一種情況下的做法,而是一個很好的理由。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM