这是一个丑陋的Javascript,很高兴找到一个解决方法.
Javascript没有类,这是一件好事.但它以一种相当丑陋的方式实现了对象之间的回退.基础构造应该有一个对象,当一个属性找不到时,它会回落到另一个对象.
因此,如果我们想要a回归,b我们会想做一些事情:
a = {sun:1};
b = {dock:2};
a.__fallback__ = b;
Run Code Online (Sandbox Code Playgroud)
然后
a.dock == 2;
Run Code Online (Sandbox Code Playgroud)
但是,Javascript代替了new运营商和prototypes.所以我们做得不那么优雅:
function A(sun) {
this.sun = sun;
};
A.prototype.dock = 2;
a = new A(1);
a.dock == 2;
Run Code Online (Sandbox Code Playgroud)
但除了优雅之外,它的功能也严格不足,因为它意味着用A创建的任何内容都会获得相同的后备对象.
我想要做的是从这个人为限制中解放Javascript,并且能够将任何其他单个对象作为其后备对象提供给任何单个对象.这样我可以在有意义时保持当前行为,但在有意义时使用对象级继承.
我最初的方法是创建一个虚拟构造函数:
function setFallback(from_obj, to_obj) {
from_obj.constructor = function () {};
from_obj.constructor.prototype = to_obj;
}
a = {sun:1};
b = {dock:2};
setFallback(a, b);
Run Code Online (Sandbox Code Playgroud)
但不幸的是:
a.dock == undefined;
Run Code Online (Sandbox Code Playgroud)
任何想法为什么这不起作用,或任何解决方案的实施setFallback?
(我在V8上运行,通过node.js,以防这是依赖于平台的) …
http://code.google.com/apis/v8/design.html
上面的页面解释了v8团队用于实现快速属性访问的优化技术.
但它的对象实例怎么样?可以随时向对象添加新属性,因此应允许其大小增加.它是否只是使用默认大小分配内存,当它达到大小限制时创建一个新缓冲区并将旧实例复制到新缓冲区?或者还有另一个很酷的伎俩?
是否有任何类型的JavaScript和/或Google v8引擎的持久性框架?
我想存储(序列化)整个对象图(包括例如函数)并稍后重新加载它.JSON是不够的,因为它不允许存储函数并且只允许树状结构(即没有两个对象引用同一个对象).
我需要能够做到这一点(即在我编写程序嵌入v8的时候不知道JavaScript代码),因为我希望程序的用户能够使用JavaScript自定义它,但我需要存储我的程序状态(包括自定义状态)并稍后重新加载.因此,我需要存储JavaScript引擎的状态.
编辑:
例:
假设我们有以下代码:
var obj = { a: 4, b: function (x) { return x + this.a; } }
// ...
if ( ... ) { obj.a = 5; }
// ...
if ( ... ) { var c = 1; obj.b = function (x) { return x + this.a + c; } }
// ...
// now I want to serialize obj
Run Code Online (Sandbox Code Playgroud)
那么它(没有关于程序逻辑的任何元信息)是否可以序列化obj并随后反序列化,以便obj.b (2)在反序列化之后提供与序列化之前相同的结果?
第二次编辑:注意关闭.
我有一段时间试图在我的windows7机器上安装less-rails gem.
我已经设法使用这个二进制文件安装所需的therubyracer.gem:https: //github.com/stereobooster/therubyracer/downloads
我还下载了v8.dll并放入我的ruby/bin目录.到目前为止一切运行良好,捆绑安装正在运行,服务器启动没有任何问题.
但是,只要我使用较少的文件请求页面,我就会收到以下错误消息
未定义的方法`in_javascript?' for#"<"V8 :: Error:[object Object]>
我的css.file是空的
/*
*= require 'custom_less/custom'
*= require 'jquery-ui-1.8.24.custom'
*/
Run Code Online (Sandbox Code Playgroud)
custom.css.less看起来像这样
@import "twitter/bootstrap/reset";
@import "twitter/bootstrap/variables";
@import "custom_less/variables"; // Your own variable overrides.
@import "twitter/bootstrap/mixins";
@import "custom_less/mixins"; // Your own mixin.
@import "twitter/bootstrap/scaffolding";
@import "twitter/bootstrap/grid";
@import "twitter/bootstrap/layouts";
//import of further bootstrap components
//but nothing else
Run Code Online (Sandbox Code Playgroud)
我正在使用带有ruby 1.9.3的rails安装程序.
这样的问题描述不多.我发现的所有内容都通过更新至至少ruby 1.9.2来解决.但不幸的是,这对我来说不是解决方案.有人有想法吗?
谢谢
我正在打电话Script::Compile(),结果返回一个空句柄。我已经找到了这种方法,最后发现
i::Handle<i::SharedFunctionInfo> result = i::Compiler::Compile(str, ....
Run Code Online (Sandbox Code Playgroud)
返回空句柄。这意味着编译错误。
但是,有人知道在这种情况下是否有办法从编译器获取错误消息,以了解发生错误的位置?
最近我遇到了这篇关于V8引擎优化JavaScript程序的优化杀手.但这篇文章对我来说并不完全清楚,所以我想问一下这个问题.
文章指出:
优化编译器编译的代码可以很容易地比通用编译器生成的代码快100倍......重要的是要注意导致优化救助的模式会影响整个包含函数.
这是否意味着,例如,如果一些大块代码,假设一个JavaScript库,它以IIFE(立即调用函数表达式)的形式包含一个包含try {} catch(e) {}在另一个函数声明中的语句,那么整个库未优化?
看起来是这样,因为我试图运行这个命令$ node --trace_opt --trace_deopt --allow-natives-syntax try_catch.js,try_catch.js如下:
//Function that contains the pattern to be inspected (using with statement)
function optimizeWhack() {
foo();
function foo() {
try {} catch(e) {}
}
return 12
}
function printStatus(fn) {
switch(%GetOptimizationStatus(fn)) {
case 1: console.log("Function is optimized"); break;
case 2: console.log("Function is not optimized"); break;
case 3: console.log("Function is always optimized"); break;
case 4: console.log("Function is never optimized"); break;
case 6: console.log("Function …Run Code Online (Sandbox Code Playgroud) 当我尝试以下列方式将std :: string传递给脚本时,如何将std :: string转换为v8 :: string
script1 = Script :: Compile(param1);
我收到转换错误.
我知道一个事实,即在的NodeJS单个内核上运行。但是,如果我构建一个实现了多线程的 NodeJS C/C++ 插件会发生什么?这个插件会消耗一个以上的核心(应该是什么时候)?
让我们创建一个基本列表并对其进行排序,以确保2该列表始终位于列表的第一位。很简单吧?
[1, 2, 3].sort((a, b) => {
if (a === 2) return -1;
return 0;
});
Run Code Online (Sandbox Code Playgroud)
Chrome结果:
[2,1,3]
节点结果:X
[1,2,3]
为了在Node中获得此行为,您可以-奇怪的是-查看b参数,并使其返回1(如果是)2:
[1, 2, 3].sort((a, b) => {
if (b === 2) return 1;
return 0;
});
Run Code Online (Sandbox Code Playgroud)
通过这种实现,您将得到相反的结果。Chrome将为[1、2、3],Node为[2、1、3]。
您对此行为是否有逻辑解释?我的排序功能在概念上有缺陷吗?如果是这样,您将如何编写这种排序行为?
v8 ×10
javascript ×4
node.js ×3
c++ ×2
inheritance ×1
less-rails ×1
optimization ×1
persistence ×1
profiling ×1
ruby ×1
therubyracer ×1
webstorm ×1
windows-7 ×1