gpt4 book ai didi

javascript - 是否可以通过 javascript 原型(prototype)分配实例成员?

转载 作者:行者123 更新时间:2023-11-30 13:07:48 24 4
gpt4 key购买 nike

当我将一个结构与一个函数的原型(prototype)相关联,然后用该函数实例化多个对象时,它们都共享同一个结构实例。我希望每个对象都有自己的结构实例,而不必在实例化对象时显式创建新实例;这可能吗?

这是我正在尝试做的事情的浓缩示例:

function defineClass(constructor, instanceMembers) {
constructor.prototype.model = instanceMembers.model;
return constructor;
}

var visualObject = defineClass(function () { }, {
model: {
setPosition: function (x, y) {
this.x = x;
this.y = y;
}
}
});

var testA = new visualObject();
var testB = new visualObject();
testA.model.setPosition(10, 10);
console.log(testB.model.x); // outputs "1", but want it to be undefined

这是行不通的,因为 testA.model 和 testB.model 都引用同一个实体。

如果我改为在构造时克隆结构,那么它就可以工作,但我真的希望避免这种克隆操作。这段代码有效但伤害了我:

function defineClass(instanceMembers) {
var constructor = function () {
// Create a copy of the model member in this object instance
this.model = $.extend(true, {}, this.model);
};
constructor.prototype.model = instanceMembers.model;
return constructor;
}

var visualObject = defineClass({
model: {
setPosition: function (x, y) {
this.x = x;
this.y = y;
}
}
});

var testA = new visualObject();
var testB = new visualObject();
testA.model.setPosition(10, 10);
console.log(testB.model.x); // is undefined, as expected

javascript 是否提供了一种不需要实例化复制的方法来做到这一点?

最佳答案

我认为这里对原型(prototype)的用途存在误解。它用于新类的每个实例的共享成员。这些通常是函数实现,而不是属性值。

你的第二个例子起作用的原因和 Bergie 的答案起作用的原因是你们都首先定义了 prototype.model 然后你稍后在构造函数(?)中覆盖它。

在第二个例子中发生了以下问题:

第一 constructor.prototype.model = instanceMembers.model;

第二 - 从 defineClass 返回构造函数后,它被执行 - this.model = $.extend(true, {}, this.model);并覆盖来自原型(prototype)的模型。

因此您不必将属性的实例化放在原型(prototype)中,而是放在构造函数中。

查看关于 javascript 原型(prototype)的详细答案 here .

关于javascript - 是否可以通过 javascript 原型(prototype)分配实例成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15042661/

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