請幫助:) - 我不得不檢查性能訪問屬性 - 工廠函數,連續繼承和類,我不明白爲什麼連續繼承失去?畢竟,對連續繼承中複製的屬性的訪問應該是最快的。 我在Chrome上運行測試,Safari和CI總是丟失。從本次測試 https://jsperf.com/factory-function-vs-concatenative-inheritance-get性能訪問屬性 - 工廠函數與連續繼承與類
代碼:
const alien = {
sayHello() {
return `Hello, my name is ${ this.name }`;
}
};
//Delegate prototype
const createAlienFF = (name) => {
return Object.assign(Object.create(alien), {
name
});
}
//Delegate prototype - creating objects
var tabFF = [];
for(var i = 0; i < 1000; i++) {
tabFF[i] = createAlienFF('Clark' + i);
}
//Concatenative inheritance
const createAlienCI = (name) => {
return Object.assign(
{},
alien,
{name: name}
);
}
//Concatenative inheritance - creating objects
var tabCI = [];
for(var i = 0; i < 1000; i++) {
tabCI[i] = createAlienCI("Clark" + i);
}
//Class
class Alien {
constructor(name) {
this.name = name
}
sayHello() {
return `Hello, my name is ${ this.name }`;
}
}
//Class - creating objects
var tabClass = [];
for(var i = 0; i < 1000; i++) {
tabClass[i] = new Alien("Clark" + i);
}
//Tests
//1 - Delegate prototype
for(var i = 0; i < 1000; i++) {
tabFF[i].sayHello();
}
//2 - Concatenative inheritance
for(var i = 0; i < 1000; i++) {
tabCI[i].sayHello();
}
//3 - Class
for(var i = 0; i < 1000; i++) {
tabClass[i].sayHello();
}
在邊緣它是類和CI之間的聯繫,在Firefox中它是CI的勝利。所以你的問題是關於Webkit的實現細節 –
你可以在問題中包含代碼嗎? – guest271314
我覺得這個測試不夠好。例如,您應該將更復雜的類與更多級別的繼承進行比較。例如,假設你有一個10級的類層次結構。在一個版本中,您將所有內容連接到單個對象上,而在另一個版本中,您將會有一個長達10級的原型鏈。這個較長的原型鏈可能真的顯示出性能的差異。 – trusktr