2014-10-11 36 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 in c?在JavaScript對象文字表示法中設置函數的屬性

+0

[在一行中聲明和分配函數對象與對象鍵]可能的重複(http://stackoverflow.com/questions/25098069/declaring-and-assigning-a-function-object-with-object-keys在一行) – 2014-10-11 06:43:58

+0

這些答案中的任何一個適合你嗎?如果是這樣,請接受。 – 2014-10-29 07:38:44

回答

2

這在技術上是可行的,但它的醜陋

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

     return f; 
    }()) 
}; 

所以我個人沒有看到一個很好的理由這樣做的,而不是你如何在第一種情況下做到這一點。

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

這可能最接近滿足你的願望寫對象字面量形式的函數屬性。

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

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

隨意與$.extend_.extend更換Object.assign

根據對你的容忍爲了醜陋,您可以嘗試以下內容,在不使用IIFE的情況下對@ zerkms提案進行變更(您需要變量x):

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

真的很好......直到後來纔會拒絕答案。 – geoyws 2014-10-11 07:03:02

相關問題