性能方面哪个更好:对象原型还是构造函数本机函数? [复制]

Posted

技术标签:

【中文标题】性能方面哪个更好:对象原型还是构造函数本机函数? [复制]【英文标题】:Performance wise which is better: An object protype or an constructors native function? [duplicate] 【发布时间】:2016-05-17 22:45:13 【问题描述】:

在性能方面什么是更好的做法: 创建原型或将方法添加到构造函数。

这是我的代码:

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 变成原型,但这会提高性能还是降低性能? (或者什么都不做……)

我应该始终将方法放在原型中还是在构造函数中?

【问题讨论】:

看:***.com/questions/12180790/… 【参考方案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:

向构造函数添加方法时,会在每个对象实例上创建每个方法的副本:

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:

【讨论】:

【参考方案2】:

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

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

性能优化成本高昂,通常会导致代码更难理解和维护。大多数时候,您希望使用最容易理解和最简单的方式来做某事,而不是优化性能。了解绩效决策的重要性和概况;优化每一件事几乎都是净损失。

至于最佳实践,我担心这些在 Stack Overflow 上是题外话,因为它们总是非常主观并且会吸引非常固执己见的答案,不太可能很有帮助。您可以尝试一些编程论坛,或者只是阅读一本书或一些文章。

【讨论】:

以上是关于性能方面哪个更好:对象原型还是构造函数本机函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 的 ToUpper 或 SQL 中的 Upper 函数的性能方面哪个更好

232 constructor构造函数,构造函数实例原型对象的三角关系

《设计模式之禅》之原型模式

js构造函数

javascript构造函数及原型对象

JavaScript构造函数+原型创建对象,原型链+借用构造函数模式继承父类练习