正如你们中的一些人可能已经注意到jsperf已经停止了一段时间.但我仍需要描述我的Javascripts.没有外部软件的帮助,是否有可能在理想情况下进行比较测试?
我有一个长期的假设,即深prototype链会导致物业访问者的性能下降.我试图解释一下隐藏吸气器或添加原型对象时,我快速基准测试结果导致了与我期望的相反的结果.
这里发生了什么?我是否遗漏了一些明显的东西,或者这是否彻底证明了我(和其他人)关于prototype链条上属性访问者性能的假设是错误的?
const object1 = {
foo: 'Hello, World!',
get bar () { return this.foo }
};
const object2 = Object.assign(Object.create({
get bar () { return this.foo }
}), {
foo: 'Hello, World!'
});
let result;
Run Code Online (Sandbox Code Playgroud)
(控制,没有prototype)
result = object1.bar;
Run Code Online (Sandbox Code Playgroud)
(实验,用prototype)
result = object2.bar;
Run Code Online (Sandbox Code Playgroud)
测试1比测试2慢了92.85%,这意味着放置get bar () {}在prototype链中而不是在对象自己的属性中导致属性访问器的速度增加14倍.请参阅Object.create()了解对象的布局是如何不同的.
79,323,722 ops/s±0.34%
1,108,762,737 ops/s±0.15%
使用谷歌浏览器63.0.3239.132(官方版本)(64位)在Windows …
更新2:这个问题很乱,因为我认为ES6 class不会修改.protototype,它确实如此,因此这正是我想要的.
我接受了最广泛的答案,即使所有的答案和评论都应该指出我在一开始就正确的方向:)
谢谢你们!
旧:
在旧的JS,ES6之前,当我们学习制作"类"时:
function X() {
this.foo = function(){
}
};
var x = new X();
Run Code Online (Sandbox Code Playgroud)
我们也知道每次我们都会x = new X();得到'foo'方法的副本,在每个实例中这都是使用原型的一个好主意的原因之一.
现在,在ES6中我们有了这个新的酷类语法,但是具有相同的"问题",即这里复制了'f'方法.我们如何以ES6方式避免它?或者我们还需要使用.prototype吗?
class X{
f(){
return 'f';
}
}
console.clear();
let x1 = new X();
let x2 = new X();
x2.f = function() {return 'changed f';};
console.log(x1.f());//f
console.log(x2.f());//changed fRun Code Online (Sandbox Code Playgroud)
更新
我知道我们仍然可以使用.prototype.我的问题是了解如何使用更现代的方式来实现我想要的东西,即不具有复制的方法.我检查了关于JS原型的第一个教程,如果我的英语很差,请查找引文:) - 在https://hackernoon.com/prototypes-in-javascript-5bba2990e04b上找到:
(...)即使用构造函数创建的每个对象都将拥有自己的属性和方法副本.有两个函数fullName实例做同样的事情是没有意义的.为每个对象存储单独的函数实例会导致内存浪费.我们将看到我们如何解决这个问题.
你还提到这class ...只是一个语法糖,但是为什么......下面的函数FC,我们可以看到直接在fc1中看到"f"方法,并且
function FC() {
this.v = 42;
this.f …Run Code Online (Sandbox Code Playgroud)我试图围绕对象链接其他对象来编写一个Node模块.这是我到目前为止(灵感来自这个答案):
'use strict'
// Composable prototype object
var parent = {
publicVar: 1,
doSomething() {
return externalMethod(this.publicVar) + 10
}
}
// Composable prototype object
var child = {
doSomethingChild() {
return this.publicVar + 20
}
}
// an external method
function externalMethod(arg) {
return arg
}
// the parent factory
function Parent() {
let privateVar = 2
return Object.assign({
getPrivate() {
return privateVar
}
}, parent)
}
// the child factory
function Child() {
let privateVar = …Run Code Online (Sandbox Code Playgroud) [(ngModel)]="room"与绑定到对象的属性相比,绑定到简单字段(例如)时的性能是否有任何差异?(例如[(ngModel)]="lesson.room")如果是,为什么?
关于 getter:我的理解是否正确,绑定到 getter/setter 以及例如单向绑定到函数是不好的,因为该函数将在每个检测周期被调用,而 Angular 无法区分没有变化的情况以及实际发生更改并且实际上需要更新视图的情况?这应该使吸气剂成为这方面性能最低的选项。
javascript ×4
ecmascript-6 ×2
performance ×2
angular ×1
binding ×1
data-binding ×1
getter ×1
optimization ×1
prototype ×1
stampit.js ×1