出于某种原因,看起来构造函数委派在以下代码段中不起作用:
function NotImplementedError() {
Error.apply(this, arguments);
}
NotImplementedError.prototype = new Error();
var nie = new NotImplementedError("some message");
console.log("The message is: '"+nie.message+"'")
Run Code Online (Sandbox Code Playgroud)
运行这个给出The message is: ''
.有关为什么,或者是否有更好的方法来创建新Error
子类的任何想法?是否存在我不知道apply
的本机构Error
造函数的问题?
我试图用ES6和Babel扩展Error.它没有成功.
class MyError extends Error {
constructor(m) {
super(m);
}
}
var error = new Error("ll");
var myerror = new MyError("ll");
console.log(error.message) //shows up correctly
console.log(myerror.message) //shows empty string
Run Code Online (Sandbox Code Playgroud)
Error对象永远不会获得正确的消息集.
现在我已经在SO上看到了一些解决方案(例如这里),但它们看起来都非常非ES6-y.如何以漂亮的ES6方式做到这一点?(那是在Babel工作)
我使用以下内容来获取JavaScript调用者函数名称:
var callerFunc = arguments.callee.caller.toString();
callerFuncName = (callerFunc.substring(callerFunc.indexOf("function") + 8, callerFunc.indexOf("(")) || "anoynmous")
Run Code Online (Sandbox Code Playgroud)
有没有办法发现调用该方法的行号?
另外,有没有办法获取调用该方法的JavaScript文件的名称?还是源URL?
在JavaScript中,我们有几种获取对象属性的方法,具体取决于我们想要获得的内容.
1)Object.keys()
,它返回一个对象的所有自己的可枚举属性,一个ECMA5方法.
2)一个for...in
循环,它返回一个对象的所有可枚举属性,无论它们是自己的属性,还是从原型链继承.
3)Object.getOwnPropertyNames(obj)
返回对象的所有属性,可枚举与否.
我们也有这样的方法hasOwnProperty(prop)
让我们检查属性是继承还是实际属于该对象,propertyIsEnumerable(prop)
顾名思义,它让我们检查属性是否可枚举.
有了所有这些选项,就无法获得对象的不可枚举的非自有属性,这就是我想要做的.有没有办法做到这一点?换句话说,我可以以某种方式获取继承的非可枚举属性的列表吗?
谢谢.
我正在尝试为自定义错误实现一个模块.
应该可以使用此模块在app的require-statement中实例化单个错误:
var MyCustomError = require('custom-error')('MyCustomError');
Run Code Online (Sandbox Code Playgroud)
这是模块:
'use strict';
var _CACHE = {};
function initError(name) {
function CustomError(message) {
this.name = name;
this.message = message;
}
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.constructor = CustomError;
_CACHE[name] = CustomError;
}
function createCustomError(name) {
if (!_CACHE[name]) {
initError(name);
}
return _CACHE[name];
}
module.exports = createCustomError;
Run Code Online (Sandbox Code Playgroud)
到目前为止,上面的要求一线工作正在进行中.
现在,在我的服务中,我想明确地捕获这个错误:
var MyCustomError = require('custom-error')('MyCustomError')
// ...
return fooService.bar()
.catch(MyCustomError, function (error) {
logger.warn(error);
throw error;
})
Run Code Online (Sandbox Code Playgroud)
如果我在测试中通过抛出MyCustomError来拒绝fooService.bar的承诺,那么这很有用.
但是,这只能起作用,因为我的测试和服务使用了相同的MyCustomError 实例.
例如,如果我删除了我的自定义错误模块中的缓存机制,则不会再达到/执行catch,因为bluebird不理解这两个错误的类型相同:
function createCustomError(name) {
//if (!_CACHE[name]) …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个小型JS库,并在那里使用自定义错误异常.
那么,我决定以这种方式从本机Javascript Error对象继承它们(ORLY?):
var MyError = function(){
Error.prototype.constructor.apply(this, arguments);
};
// Inherit without instantiating Error
var Surrogate = function(){};
Surrogate.prototype = Error.prototype;
MyError.prototype = new Surrogate();
// Add some original methods
MyError.prototype.uniqueMethod = function(){...}
Run Code Online (Sandbox Code Playgroud)
看起来像平常的继承..但是!
var err = new MyError("hello! this is text!");
console.log(err.message); // is giving me empty string!
Run Code Online (Sandbox Code Playgroud)
我已经在这里和MDN上阅读了有关此内容的文章,但所有人都说我要使用这样的东西:
var MyError = function(msg){
this.message = msg;
};
Run Code Online (Sandbox Code Playgroud)
但我的问题是 - 如果不是在Error的构造函数中,那么消息初始化的地方?可能有人知道Error本机构造函数是如何工作的?
谢谢!
PS如果它有趣 - 我正在开发Enum.js库.
javascript ×6
exception ×2
babeljs ×1
bluebird ×1
ecmascript-6 ×1
inheritance ×1
native ×1
node.js ×1
object ×1
oop ×1
properties ×1
prototype ×1
transpiler ×1