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?
答案 0 :(得分:5)
你不能。但是,你可以做到
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; }
)
};
随意用Object.assign
,$.extend
等替换_.extend
。
根据您对丑陋的容忍度,您可以尝试以下方法,在没有IIFE的情况下对@ zerkms的提案进行修改(您需要变量x
):
var api = {
c: (x = function() { }, x.m = function() { return 2; }, x)
};
答案 1 :(得分:2)
技术上可行,但它很难看
var api2 = {
c: (function() {
var f = function() {};
f.m = 'something else';
return f;
}())
};
因此,我个人没有理由这样做,而不是在第一种情况下如何做到这一点。