2015-05-06 10 views
5

mi hanno due funzioni in un oggettoCome rendere la funzione concatenabile senza eseguire? come `obj.fn.fn` invece di` obj.fn(). fn() `

var obj = {}; 
obj.fn1 = function(){ console.log('obj.fn1'); return this; }; 
obj.fn2 = function(){ console.log('obj.fn2'); return this; }; 

Voglio essere in grado di fare

obj.fn1.fn2() 
obj.fn2.fn1() 

Come fare questo?

EDIT: fn1 e fn2 potrebbero essere funzioni o di accesso alle proprietà, non mi importa, purché fanno roba.

L'ho visto in molte librerie, come chalkcolor.red.bold('string').

+1

Non puoi farlo. Poiché le funzioni in javascript sono valori di prima classe, è imperativo che tu possa distinguere tra una funzione e il valore di ritorno di una. Quando vedi 'color.red.bold', il concatenamento avviene attraverso la ricerca delle proprietà degli oggetti, non delle funzioni. – doldt

+0

@doldt 'color.red' si comporta come una proprietà in' color.red.bold (..) 'ma come una funzione in' color.red (..) '. Quindi le proprietà possono comportarsi come funzioni? Io non capisco – laggingreflex

+1

Posso arrivare a metà strada - http://jsfiddle.net/knn8pu5m/ - ma non riesco a capire come permettere che l'ultima proprietà a cui si accede possa essere richiamabile come una funzione oltre ad essere qualcosa puoi concatenare. Sarebbe utile se tu dessi un esempio specifico piuttosto che semplicemente "molte librerie". – Quentin

risposta

0

Penso che siano solo alcuni oggetti nidificati. Date un'occhiata a questo codice:

function Color(c) { this.color = c; } 
 
Color.prototype.bold = function(text) { return '<strong style="color: ' + this.color + '">' + text + '</strong>'; } 
 

 
var colors = { 
 
    red: new Color('red'), 
 
    blue: new Color('blue') 
 
} 
 

 
document.write(
 
    colors.red.bold('text')); 
 

 
document.write(
 
    colors.blue.bold('text'));

1

si può fare se fn1, fn2 e obj hanno riferimenti a entrambe le funzioni. Object.assign (ES6) aiuta qui:

var base = { 
    fn1: function fn1() { console.log('fn1'); return this; }, 
    fn2: function fn2() { console.log('fn2'); return this; } 
} 

Object.assign(base.fn1, base); 
Object.assign(base.fn2, base); 
var obj = Object.assign({}, base); 

obj.fn1(); 
obj.fn1.fn2(); 
obj.fn2(); 
obj.fn1.fn2.fn1.fn1(); 

babel.js repl

Mi aspetto che questo è come funziona il vostro esempio biblioteca.

Se Object.assign non è disponibile, è possibile utilizzare uno polyfill o un'alternativa comune come _.assign da lodash.

Problemi correlati