2016-02-08 69 views
0

性能明智什么是更好的做法: 要创建一个原型或将metood添加到构造器。更好的性能:对象原型还是构造函数原生函数?

这是我的代码:

function DateGreeting(selector) { 
    this.element = document.querySelectorAll(selector)[0]; 
    this.date = new Date(); 
    this.hours = this.date.getHours(); 
    this.greeting = function() { 
     if(this.hours <= 11) { 
      return "Morning"; 
     } else if (this.hours >= 12 && this.hours <= 17) { 
      return "Afternoon"; 
     } else { 
      return "Evening"; 
     } 
    } 
} 
DateGreeting.prototype.append = function() { 
    this.element.innerHTML = this.greeting(); 
} 

我也可以把this.greeting为原型,但将这种提高性能或降低呢? (或者什么也不做)

我应该总是把方法放在原型或构造函数中吗?

+0

Look:http://stackoverflow.com/questions/12180790/defining-methods-vi一个原型-VS-使用,这个功能于的构造函数,真正-A-PERFO –

回答

1

当创建许多DateGreeting类型的对象时,它们都将拥有您在构造函数中定义的那些方法的副本。
使用该对象时,通常会更改其属性,但方法保持不变。
因此,在原型上声明方法将是一种更节省资源的方法。因此,您可以使用许多共享相同方法的对象,而无需将方法复制到每个实例。
定制原型声明方法是性能一定要好:

// this method will be shared by all DateGreeting instances 
DateGreeting.prototype.greeting = function() { 
    if(this.hours <= 11) { 
     return "Morning"; 
    } else if (this.hours >= 12 && this.hours <= 17) { 
     return "Afternoon"; 
    } else { 
     return "Evening"; 
    } 
} 

var greeting1 = new DateGreeting(".greet"); 
var greeting2 = new DateGreeting(".greet"); 
console.log(greeting1, greeting2); 
// the output: 

output

虽然添加方法构造每个创建的每个方法的拷贝对象实例:

function DateGreeting(selector) { 
    ... 
    this.greeting = function() { 
     if(this.hours <= 11) { 
      return "Morning"; 
     } else if (this.hours >= 12 && this.hours <= 17) { 
      return "Afternoon"; 
     } else { 
      return "Evening"; 
     } 
    } 
} 

var greeting1 = new DateGreeting(".greet"); 
var greeting2 = new DateGreeting(".greet"); 
console.log(greeting1, greeting2); 
// the output: 

output2

2

工程是一个权衡的游戏。没有普遍的最佳解决方案。为简单的权衡感到高兴,就像你在这里一样。答案是:

无论函数/原型的性能影响如何,代码的99%主要部分是this.element.innerHTML = whatever;。与呈现HTML的成本相比,开销很小。

性能优化代价高昂,通常会导致难以理解和维护的代码。大多数时候,你想用最容易理解和简单的方式去做某件事,而不是优化性能。理解绩效决定所关注的地方和概况;优化每一件事情几乎总是净亏损。

至于最佳实践,我担心这些是堆栈溢出的话题,因为它们总是非常主观并且吸引了非常褒奖的答案,不太可能是非常有帮助的。你可以尝试一些编程论坛,或者只是阅读一本书或一些文章。

相关问题