Getter在javascript函数本身的实例上启用docstrings。有可能吗?

时间:2016-03-25 06:24:44

标签: javascript string class overloading

乌托邦目标:

str = "hello"
str.doc = "this is a string"
console.log(str) //prints 'hello'
console.log(str.doc) //should prints the docstring

但是,字符串是不可变的,以上情况是不可能的。

我是如何尝试解决的:

str = new String("hello")
str.doc = "this is a string"
console.log(str) //prints the string object but not 'hello'
console.log(""+str) //prints "hello"
console.log(str.doc) //correctly prints the docstring

如您所见,只有在调用.valueOf()或.toString()时,才能获得原始字符串。目标是在字符串被直接调用时获取字符串。

另一种解决方法(在coffescript中,为了简短:3行与~15)

class Configuration
    constructor: (@value, @doc) ->
    @::valueOf = -> @value

这与new String()非常相似。它只是对对象的valueOf()方法进行原型化。问题与上述相同。您无法直接console.log(str)打印原始字符串,并且都使用console.log(str.doc)

问题:

是否有可能以某种方式实现这一点,而不必重构我的整个代码库?

3 个答案:

答案 0 :(得分:2)

你可以原型String。见fiddle

var oldConsoleLog = console.log;
console.log = function ( ) {
    oldConsoleLog.apply( console, [].map.call( arguments, function ( arg ) { return arg instanceof String ? arg.valueOf() : arg; } ) );
};

答案 1 :(得分:0)

我不宽恕这一点,但您可以覆盖angular.module('MyApp', []) .controller('MyController', function($scope) { $scope.data = { fullName : '', email : '' }; $scope.resetForm = function(){ /* reset the data to a new object so that all the properties * of form are reset */ $scope.data = {}; }; }); ,以便在任何String参数上调用valueOf:

console.log

答案 2 :(得分:0)

正如评论中所述,我会进行一些重构,将str等变量替换为str + "",因此使用new String(),不是很干净,但似乎是唯一的快速解决方法。实际上,最佳解决方案是简单地使用如下的单例:

config = {
    mySetting: {
        value: "settingValue",
        docstring: "my doc string"
    }
}

并在必要时使用:config.mySetting.value 但那将是对复杂应用程序进行大量重构,而不是现在的优先级。谢谢大家的回复!