gpt4 book ai didi

Javascript 从构造函数扩展

转载 作者:行者123 更新时间:2023-12-02 07:00:25 26 4
gpt4 key购买 nike

假设我有这个:

function Foo(){
this.name = "fooos";
};

现在在脚本的后面我有一个对 Foo 的引用,以及在实例化时向 Foo 添加属性的内容。我可以这样做:

Foo.prototype.myProp = 3;

foo = new Foo();

expect(foo).to.have.property('name');
expect(foo).to.have.property('myProp');

在我需要将对象附加到原型(prototype)之前,这非常有效,如下所示:

Foo.prototype.myProp = { bar : 3 };

问题是现在实例将在 bar 上共享状态(因为 `bar 只是一个引用):

foo = new Foo();
foo2 = new Foo();

foo.myProp.bar = 5;
expect(foo2.myProp.bar).to.equal(5);

这是不可取的。但是,如果将对象添加到构造函数中,则实例不共享状态。

有解决办法吗?我无权访问构造函数来操作它。我需要将一个对象附加到原型(prototype)中的一个实例。

最佳答案

属性不必在原型(prototype)上,您可以直接将它们添加到实例中:

var f = new Foo();
f.myProp = { bar: 3 };

I know that. Its not what I want.

我能想到的通过带有属性(不是方法;@meagera solution 使用方法)的原型(prototype)来做到这一点的唯一方法是一个丑陋的 hack,您可以在其中定义使用 Object.defineProperty(仅限 ES5)在原型(prototype)上添加属性,然后在第一次访问时重新定义它,如下所示:

Object.defineProperty(Foo.prototype, "myProp", {
get: function() {
var obj = { bar: 3 };
Object.defineProperty(this, "myProp", {
get: function() {
return obj;
},
set: function(value) {
obj = value;
}
});
return obj;
}
});

Live Example | Source

推荐那个。 :-)


另一种方法是在 Foo 前面添加一个门面,如下所示:

var OriginalFoo = Foo;
Foo = function() {
OriginalFoo.apply(this, arguments);
this.myProp = { bar: 3 };
};
Foo.prototype = Object.create(OriginalFoo.prototype);

当然,这只适用于通过new Foo执行此代码后创建的对象。

关于Javascript 从构造函数扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21822965/

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