gpt4 book ai didi

javascript - 性能:原型(prototype)私有(private)方法

转载 作者:行者123 更新时间:2023-11-28 11:02:29 26 4
gpt4 key购买 nike

给定对象:

object = function ()
{
var pub = {
m1: function () {
m2();
m3();
}
};

function m2() {
...
}

function m3() {
...
}

return pub;
}

该对象将被实例化多次。我应该将私有(private)函数添加到原型(prototype)中,这样它们就不会在每个实例中复制吗?

私有(private)方法的数量 X 与实例的数量 Y 的限制可能是什么。

最佳答案

在 ES5 的 OOP Javascript 中,您的对象可以有 3 种类型的成员。

  • 公开
  • 私有(private)
  • 特权

公共(public)成员是在原型(prototype)中创建的,任何人都可以访问。

var MyCustomClass = function() {
};

MyCustomClass.prototype.myPublicMethod = function() {
};

var myCustomObject = new MyCustomClass();
myCustomObject.myPublicMethod();

私有(private)成员是在类构造函数内部创建的,只能在类构造函数内部访问(尽管位于同一个类中,但无法在公共(public)方法中访问它们)。

var MyCustomClass = function() {
var m_privateMember; //cannot be accessed outside the constructor
};

特权成员实际上是公共(public)成员,但在构造函数内声明,因此它们可以使用私有(private)成员。

var MyCustomClass = function() {
var m_privateMember = 2;

//Priviledged method (which is a GETTER here)
this.GetPrivateMember = function() {
return m_privateMember;
};
};

var myCustomObject = new MyCustomClass();
console.log(myCustomObject.GetPrivateMember()); //2

这允许您通过调用特权 GETTER 来访问公共(public)方法中的私有(private)成员。

现在,关于性能。我目前在一个拥有 700 多个对象的项目中使用这种模式,其中有超过 12 个私有(private)成员和更多特权成员(~30),因为我不喜欢使用公共(public)成员(必须在 2 个不同的对象中定义成员)地方,构造函数和 .prototype,所以我只是在构造函数中定义它们,并在构造函数末尾调用“初始化”方法)。而且我没有注意到任何性能问题。对象仍在尽可能快地实例化。我不能保证没有性能成本,但恕我直言,这并不明显。

您还可以这样定义属性:

var MyCustomClass = function() {
var myPrivateMember;

Object.defineProperty(MyCustomClass.prototype, 'myProperty', {
get: function() {
return myPrivateMember;
},
set: function(_param) {
myPrivateMember = _param;
}
});
}

var myObject= new MyCustomClass();
myObject.myProperty = 6;
myObject.myProperty; //6

但我不喜欢它,因为我更喜欢调用 GetMyProperty(),但这是一个品味问题。

您应该检查 Object.definyProperty,因为我可能没有确切的语法。

<小时/>

编辑性能问题。

因此,我在浏览器 (Chrome 46) 中运行了一些测试,私有(private)成员和公共(public)成员之间没有性能影响。

对于具有 12 个私有(private)成员的 ClassA 与具有 12 个公共(public)成员的 ClassB,我实例化了每个类的 1,000,000 个对象,平均进行了 10 次测试,对于 ClassA 大约 250 毫秒,对于 ClassB 大约 245 毫秒。

因此,请随意使用私有(private)成员。

关于javascript - 性能:原型(prototype)私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33958472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com