gpt4 book ai didi

javascript - 如何向构造函数创建的 javascript 对象的所有实例添加数据/函数?

转载 作者:行者123 更新时间:2023-11-28 20:57:44 25 4
gpt4 key购买 nike

如何将数据/函数添加到构造函数创建的 javascript 对象的所有实例中,以便所有实例都具有相同的引用而不是其副本?

基本上实现了 C# 中静态方法的等效项。

例如,给定以下创建 Widget 类的代码。

(function() {

var Widget = function() {
};

Widget.prototype.init = function(data) {
this.data = data;
};

this.Widget = Widget;
}).call(this);
var instance1 = new Widget();
instance1.init('inst1');
var instance2 = new Widget();
instance2.init('inst2');

alert(instance1.data); // inst1
alert(instance2.data); // inst2

在上述情况下,每个实例都有自己的数据属性副本。不过,我想添加一个为所有当前和 future 实例设置数据的函数。

我当前的解决方案是将函数添加到构造函数对象,而不是其原型(prototype)。参见下面的例子。这有什么陷阱吗?有更好的方法吗?

(function() {

var Widget = function() {
};

Widget.prototype.init = function(data) {
this.data = data;
};

Widget.addStaticData = function(data) {
this.staticData = data;
};

Widget.prototype.getStaticData = function() {
return Widget.staticData;
};

this.Widget = Widget;
}).call(this);
var instance1 = new Widget();
instance1.init('inst1');

Widget.addStaticData('static');

var instance2 = new Widget();
instance2.init('inst2');

alert(instance1.data); // inst1
alert(instance2.data); // inst2
alert(instance1.getStaticData()); // static
alert(instance2.getStaticData()); // static

最佳答案

我能想到的三个陷阱:

  • 方法论:原型(prototype)是共享、重用、继承功能/属性的地方 - 就这样利用它

  • 性能:继承比每次在实例上设置更快。 John Resig(jQuery 创建者)在一篇博客文章中对此做了一些基准测试,但我目前似乎找不到。

  • 失去了继承属性(property)和自己属性(property)之间的区别。如果通过构造函数将所有内容应用到实例,则所有内容都是实例属性。

一切都通过构造函数:

function Dog() { this.legs = 4; }
var fido = new Dog();
fido.name = 'Fido';
for (var i in fido) if (fido.hasOwnProperty(i)) alert(i+' = '+fido[i]);

...警告这两个属性,因为它们被视为实例自己的属性。

通过原型(prototype)和构造函数

function Dog2() { }
Dog2.prototype.legs = 4;
var fido = new Dog2();
fido.name = 'Fido';
for (var i in fido) if (fido.hasOwnProperty(i)) alert(i+' = '+fido[i]);

...仅提醒name,因为这是唯一的实例属性。 (尽管如此,fido.legs 是可检索的 - 但它来自原型(prototype))。

[编辑 - 回应下面OP的评论]

如果您想要静态方法,则应在声明后将其添加到函数中。

function Dog() {}
Dog.static = function() {}

关于javascript - 如何向构造函数创建的 javascript 对象的所有实例添加数据/函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11760614/

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