2014-10-11 2 views
1
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 в объектной литературе?Настройка свойств функций в объектной литературе JavaScript

+0

Возможный дубликат [Объявление и назначение объекта функции с помощью ключей объекта в одной строке] (http://stackoverflow.com/questions/25098069/declaring-and-assigning-a-function-object-with-object-keys -in-one-line) –

+0

Работали ли какие-либо из этих ответов? Если да, примите. –

ответ

2

Это технически возможно, но это некрасиво

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

     return f; 
    }()) 
}; 

Так что лично я не вижу причины делать это таким образом, вместо того, как вы делаете это в 1-ом случае.

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 функция, доступная в большинстве структур (или Object.assign в ES6):

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

Feel свободно заменить Object.assign с $.extend, _.extend и т.д.

В зависимости от вашей толерантности для уродства вы можете попробовать следующее: вариант предложения @ zerkms без IIFE (вам понадобится переменная x):

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

действительно приятно ... Отказаться от ответа будет позже. – geoyws

Смежные вопросы