gpt4 book ai didi

javascript - 是否可以将非共享变量添加到原型(prototype)中?

转载 作者:行者123 更新时间:2023-11-30 11:45:25 25 4
gpt4 key购买 nike

我正在构建一个函数,可以用一些常用函数改造我的一些原型(prototype)。

我还想通过这个机制添加对象实例特定的变量,有点像:

function give_weird_container(target) {
target.<somehow instance specific, not prototype>.underlying_container = [];
target.prototype.container_func = function(x, y, z) {
return this.underlying_container[x + 2*y + 3*z];
}
}

function my_class1() {}

give_weird_container(my_class1);

现在当我创建一个新的 my_class1 实例时,它应该有一个属性“uderlying_container”,就像我调用一样

this.underlying_container = [];

在构造函数中。

在 give_weird_container 函数的范围内,这是否可能?

最佳答案

Is it possible to add a not shared variable to a prototype?

没有。原型(prototype)上的所有属性都是共享的。实例特定属性只能在实例创建后设置。

但是,您可以向原型(prototype)添加一个getter,如果它不存在,它将创建一个特定于实例的属性。

例如:

Object.defineProperty(target.prototype, 'underlying_container', {
get: function() {
if (!this._underlying_container) {
this._underlying_container = [];
}
return this._underlying_container;
},
});

getter 是共享的,但返回的值是每个实例。

如果您不喜欢每次访问 this.underlying_container 时都会执行 getter,您可以在第一次调用原型(prototype)属性时将其替换为实例属性:

Object.defineProperty(target.prototype, 'underlying_container', {
get: function() {
Object.defineProperty(this, 'underlying_container', {value: []});
return this. underlying_container;
},
});

Object.defineProperty(this, 'underlying_container', {value: []}); 将在实例 上创建一个同名的新属性,从而隐藏getter 在原型(prototype)上定义。


采纳@4caSTLe 的建议,如果可以直接改变实例,那么你可以做类似这样的事情,这有点不那么“神奇”:

var give_weird_container = (function() {
function container_func(x, y, z) {
return this.underlying_container[x + 2*y + 3*z];
};

return function(target) {
target.underlying_container = [];
target.container_func = container_func;
};
}());

function my_class1() {}

var instance = new my_class1();

give_weird_container(instance);

关于javascript - 是否可以将非共享变量添加到原型(prototype)中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41149199/

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