2015-07-20 89 views
0

通过API设计的Javascript功能我需要的是这样的:像个对象和功能

Store = function(fn, args) { 
    return this[fn](args); 
} 
Store.getOptions() { return this.options} 
Store.setLog(args) { this.options.log = args} 

创建对象的情况下,从存储与不同的选项,例如:

option1 = {save:false, log: true} 
Store1 = new --> Store(option1) //pseudo code object creation 

let opt1 = Store1('getOptions'); //Store acting like a function 

Store1('setLogs', false);   //same call 
Store1.setLogs(false); 

商店的行为像一个对象(创建新的对象)并且可以被调用。

我试图用Store.bind(选项)但定义的属性getOptionssetLog迷路了。

回答

0

EcmaScript 5或EcmaScript 6(EcmaScript 2015)?

的EcmaScript 5类创作:

// Declare constructor for class Store: 
var Store = function(){ /* This code will be executed when you call 'new Store()' */ }; 

注意:类实例的所有特性和功能添加到原型类的构造函数的性质。 */

// Add properties for each instance of class Store: 
Store.prototype.options = {Hi:'World'}; // Each instance of Store will have object with property Hi:'World' 

// Add functions for each instance of class Store: 
Store.prototype.SayHello = function(name){ 
    console.log('Hello ', name); 
}; 

用法:

var store1 = new Store(); 
store1.SayHello('Phillip'); //Will output: Hello Phillip 

的EcmaScript 6(EcmaScript的2015年)

采取Mozilla Developer Network

0

你怎么可能会做一看一篇关于类的使用情况如何?

let opt1 = Store1('getOptions'); //Store acting like a function 
Store1('setLogs', false);   //same call 

只要定义方法或撰写他们..

我可以观察到,你有2个不同的使用情况在这里:

  1. 获取/设置选项
  2. 获取/设置相关的日志东东?

那么,为什么不:

var optionsProto = function() { 
    var options = []; 

    var getOption = function getOption(key) { 
    if(options[key]) { 
     return options[key]; 
    } 

    //Handle error or return undefined.. 
    }; 

    var setOption = function setOption(key, val) { 
    if(!options[key]) { 
     options[key] = val; 
    } 

    //It already exists? Handle it somehow 
    }; 

    return { 
    getOption: getOption, 
    setOption: setOption 
    }; 
}(); 

var debuggerProto = function() { 
    var level = 'DEBUG'; 

    var getLevel = function getLevel() { 
    return level; 
    }; 

    var setLevel = function setLevel(_level) { 
    level = _level; 
    }; 

    return { 
    getLevel: getLevel, 
    setLevel: setLevel 
    }; 
}(); 


var mixedUpStoreProto = _.extend({}, optionsProto, debuggerProto); 

var store = Object.create(mixedUpStoreProto); 

store.setLevel('INFO'); 
store.getLevel(); //INFO 

store.addOption('somekey', 'someval'); 
store.getOption('somekey'); // someval 

这样你就可以通过重新使用原始的撰写大量的对象。

0

首先,感谢@ Epsil0neR和@ gor181的答案,但有可能比我没有做正确的问题。 其实我再次问Ramda Github的问题,因为我需要用咖喱函数实现API。最后,我迟到了很多小时。

下面是代码,或许是为别人有用:https://github.com/ramda/ramda/issues/1291

//return 'fn' with all 'obj' props 
function functionize(obj, fn) 
{ 
    let fn = fn; 
    for(let i in obj){ fn[i] = obj[i] }; 
    return fn; 
} 


SubStore = function(options) { 
    this.options = options; 
} 
SubStore.prototype.getOptions = function() { return this.options } 
SubStore.prototype.setOptions = function(options) { this.options = options } 
SubStore.prototype.insert = function(doc) { return doc } 
SubStore.prototype.find = function(selector, options) { return selector } 

SubStore.create = function(options) { 
    let sub = functionize(new SubStore(options), R.curry(function (args, fn) { 
     let self = sub;   //reference to new SubStore obj 
     return self[fn](args); 
    })) 
    return sub; 
} 

Store = function(options) { 
    this.options = options; 
} 
Store.prototype.insert = function(args) { 
    for (let i = 0, len = args.length; i < len; i++) { 
     if (R.is(Function, args[i])) { args[i] = args[i]('insert') } 
     console.log(args[i]); 
    } 
} 
Store.prototype.find = function(args) { 
    for (let i = 0, len = args.length; i < len; i++) { 
     if (R.is(Function, args[i])) { args[i] = args[i]('find') } 
     console.log(args[i]); 
    } 
} 

测试代码

store = new Store(); 

sub1 = SubStore.create({path:'perfil'}); 
sub2 = SubStore.create({path:'rol'}); 

// test#1 
store.insert([ sub1({name: "Foo"}), sub2({age: 18}) ]); 

// test#2 
store.insert([ sub1.insert({name: "Foo"}), sub2.insert({age: 18}) ]); 

是你需要一个Javascript ES5版本只是var取代let,你必须得添加Ramda库咖喱功能。

感谢