乌托邦目标:
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)
问题:
是否有可能以某种方式实现这一点,而不必重构我的整个代码库?
答案 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
但那将是对复杂应用程序进行大量重构,而不是现在的优先级。谢谢大家的回复!