我希望为一个方法添加额外的功能,比如说:
所以原始的“log”功能保留下来了,我可以让它做一些新的事情。这种可能吗?我读了一些关于使用原型的文章,但还没有完全理解。
非常感谢。
console.log()
所以原始的“log”功能保留下来了,我可以让它做一些新的事情。这种可能吗?我读了一些关于使用原型的文章,但还没有完全理解。
非常感谢。
console.log()
这非常简单。如果你想让你的新的 log
方法取代旧的 log
方法,只需要像这样做:
console._log = console.log; // just backing up old log method
console.log = function(){
console._log(arguments);
alert("I'm doing something else here");
}
console.log(console);
更新:
所有提供的解决方案,包括我的,都不能完美地重现 @TomBates 所述的日志行为。输出不同是因为参数被包装在对象中记录,而不是单独传递。我找到唯一可以重现旧日志和扩展功能行为的方法就是这样:
console.log(window, this, console); // old log in action
console._log = console.log; // just backing up old log method
console.log = function(){
var args_string = '';
for(i in arguments){
if(arguments.hasOwnProperty(i)){
args_string += 'arguments['+ i + ']';
if(i != arguments.length - 1){
args_string += ',';
}
}
}
var expression = 'console._log(' + args_string + ');';
eval(expression);
alert("I'm doing something else here");
// your dazzling method extension here
}
console.log(window, this, console); //new log in action
虽然不太优雅,但达到了预期的效果。现在旧日志和新日志的输出结果是相同的。
console.log.length
。 - Raynosarguments
对象包装了函数参数并干扰了日志输出。看一下更新后的答案,它有一个新的更好的解决方案(不太优雅)。 - marcio由于JavaScript是可调用的面向对象语言,您可以这样做:
console._log_without_my_extension = console.log
console.log = function() { console._log_without_my_extension(); .... }
例如。
据我所知,JS中的扩展不是默认功能,唯一的方法类似于以下内容:
var oldLog = console.log;
console.log = function(){
//doStuff
oldLog(arguments);
//doStuff
}
prototype
属性,console
不是其中之一。请使用其他答案。阅读以下内容以了解关于prototype
的知识:
http://phrogz.net/js/classes/ExtendingJavaScriptObjectsAndClasses.html
顺便说一下:除非您像其他答案中建议的那样制作包装器,否则无法扩展函数。console.logMe = function(){console.log(arguments)};
console.logMe("welcome to SO");
由于我曾经错误地理解了问题,现在我想进行更正。OP 希望将基本方法抽象化并覆盖基本方法。(看起来我说的废话,请查看下面的代码)
function myConsole() {}
myConsole.prototype = {
_log: console.log,
Log: function () {
this._log(arguments)
}
};
使用其他方法时,您将不得不一遍又一遍地执行它。但是在这里,您创建的每个实例都将具有扩展方法和自己内置的实现。
var x = new myConsole();
x.Log("Hi this is Deeptechtons");