如何创建一个默认情况下返回值但又具有扩展方法的方法?

时间:2019-04-03 09:18:21

标签: javascript javascript-objects

我们可以创建简单的东西:

getName() { return 'My Name';}

还有一个返回对象的方法,其中包含更多方法,例如:

getName() {
    var name = 'My Name';
    return {
        raw: function() { return name; }
        decorate: function() { return '・°☆.。' + name + '.☆*・°☆'; }
    };
}

如何结合这两种想法,如果a方法称为getName(),则它返回一个字符串。同时,您仍然可以像扩展方法一样调用其方法,例如getName().decorate()(或getName.decorate()?)。

2 个答案:

答案 0 :(得分:3)

除非您传入用于决定返回某件事的参数,否则您不能使getName返回既是字符串又是非字符串的东西宾语。通过返回带有返回字符串的toString方法的对象(您可能还提供valueOf),可以得到 close ,但不是全部闭合:

function getName() {
    var name = 'My Name';
    return {
        toString() { return name; },
        valueOf() { return name; },
        decorate() { return '・°☆.。' + name + '.☆*・°☆'; }
    };
}

console.log(String(getName()));
console.log("The name is: " + getName());
console.log(getName());
console.log(getName().decorate());

但是请记住,它总是返回一个对象。当某人尝试将对象转换为带有提示“字符串”的基元时,将触发toString。当某人尝试将该对象转换为带有提示“ number”的图元时,将触发valueOf。 (在两种情况下,如果第一个方法不可用或返回一个对象,则调用另一个方法; details in the spec。)

答案 1 :(得分:1)

首先想到的是,您可以选择传递一些参数作为第一个或第二个调用。

decorate = (name) =>
{
   console.log('・°☆.。' + name + '.☆*・°☆');
   return '・°☆.。' + name + '.☆*・°☆';
}
    
raw = (name) =>
{
   console.log(name);
   return name;
}
    
getName = (option) =>
{
   var name = 'Name';
   if (!option) { //default
     console.log(name + " Whatsup");
     return name + " Whatsup";
   }
   return (option === 'decorate' ? decorate(name) : raw(name));
}
    
getName();