我在Javascript中定义自定义错误对象时发现了一个奇怪的行为:
function MyError(msg) {
Error.call(this, msg);
this.name = "MyError";
}
MyError.prototype.__proto__ = Error.prototype;
var error = new Error("message");
error.message; // "message"
var myError = new MyError("message");
myError instanceof Error; // true
myError.message; // "" !
Run Code Online (Sandbox Code Playgroud)
为什么new Error("message")设置message属性,而Error.call(this, msg);不是?当然,我可以this.message = msg在MyError构造函数中定义,但我不太明白为什么它还没有设置在第一位.
它看起来像的Object.create创建磁盘阵列走路像数组嘎嘎像数组,但仍然不是真正的数组.至少用v8/node.js.
> a = []
[]
> b = Object.create(Array.prototype)
{}
> a.constructor
[Function: Array]
> b.constructor
[Function: Array]
> a.__proto__
[]
> b.__proto__
[]
> a instanceof Array
true
> b instanceof Array
true
> Object.prototype.toString.call(a)
'[object Array]'
> Object.prototype.toString.call(b)
'[object Object]'
Run Code Online (Sandbox Code Playgroud)
一些Javascript专家可以解释为什么会这样,以及如何使它使我新创建的数组与真正的数组无法区分?
我的目标是克隆数据结构,包括可能附加自定义属性的数组.当然,我可以使用手动将属性附加到新创建的数组Object.defineProperty,但有没有办法使用Object.create?
在node.js/Mongoose项目中,我有一个包含对外部图像文件的引用的模式.
var PageSchema = new Schema({
title: String
, media: {
digest: String
, name: String
}
});
Run Code Online (Sandbox Code Playgroud)
这些文件具有存储在文件本身中的其他属性:url,width,height,exif字段等.在将模型发送到res.render()之前,需要填充这些字段.
对于某些领域,事情是同步的,虚拟只是完成工作:
PageSchema.virtual('media.url').get(function () {
return appPaths.fileUrl(this.media);
});
Run Code Online (Sandbox Code Playgroud)
但是,宽度/高度或exif字段需要异步调用.我想过使用中间件来填充它们,但这似乎不起作用:
PageSchema.post('init', function(next) {
var media = this.media;
var fileName = filedb.absoluteFilePath(media);
im.identify(fileName, function(err, features) {
if (err) {
media.width = 0;
media.height = 0;
} else {
media.width = features.width;
media.height = features.height;
}
next();
});
});
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?是否有解决此类问题的通用设计模式?(除了在数据库本身中复制这些信息外?)
我有一台运行Java-jar文件的Linux服务器,可以加密多个文件.
Android和iPhone App下载该文件并将其解密.我必须使用什么算法?
我认识到我在Java中使用的算法在Android中不起作用.我在Java中所做的是:
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}
Run Code Online (Sandbox Code Playgroud)
什么在上面的代码中不起作用?任何替代品?