【问题标题】:Different ways to add functions to Javascript object向 Javascript 对象添加函数的不同方法
【发布时间】:2011-08-18 15:25:25
【问题描述】:

在 Javascript 中,这两种向对象添加函数的方式有什么区别吗?出于某种原因更可取吗?

function ObjA() {
    this.AlertA = function() { alert("A"); };
}
ObjA.prototype.AlertB = function() { alert("B"); };

var A = new ObjA();
A.AlertA();
A.AlertB();

【问题讨论】:

标签: javascript


【解决方案1】:

当然有区别。如果您定义this.AlertA,您正在为ObjA 的实例定义一个本地方法。如果将AlertA 添加到ObjA 构造函数 的原型中,则会为ObjA 的每个实例定义它。在这种情况下,后者效率更高,因为它只分配一次,而每次创建 ObjA 的实例时都会分配一个本地方法。

所以使用this.AlertA in:

var A = new ObjA, 
    B = new ObjA,
    C = new ObjA;

对于 A、B 和 C,构造函数必须添加方法 AlertA。另一方面,AlertB 只添加一次。您可以使用以下方法进行检查:

function ObjA() {
        alert('adding AlertA!');
        this.AlertA = function() { 
            alert("A"); 
        };

        if (!ObjA.prototype.AlertB) {
            alert('adding AlertB!');
            ObjA.prototype.AlertB = function() { 
                alert("B"); 
            };
        }
}

var A = new ObjA,  //=>  alerts adding AlertA! and alerts adding AlertB!
    B = new ObjA,  //=>  alerts adding AlertA!
    C = new ObjA;  //=>  alerts adding AlertA!

【讨论】:

    【解决方案2】:

    使用对象构造函数会将该函数的副本分配给对象的每个新实例。使用原型设计将导致所有实例共享一个函数。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2014-05-26
      • 2018-03-17
      相关资源
      最近更新 更多