gpt4 book ai didi

javascript - 如何在javascript中获取真正的取消引用的对象实例

转载 作者:行者123 更新时间:2023-12-03 12:20:35 26 4
gpt4 key购买 nike

我正在尝试更好地理解 JavaScript 中的面向对象模式。我特别喜欢 EmberJS 使用 .extend 和 .create 从父类对象实现其类的方式。

我尝试自己实现一个基本版本,但没有成功,我新实例化的对象引用了同一个对象。即,如果我通过公共(public)方法在实例 a 中增加私有(private)计数器 var,然后分别对实例 b 执行相同操作,b 将反射(reflect)这两个增量。

我能够通过 Object.create(myClass) 实现取消引用的对象,但是这是不可取的,因为我希望在内部实现此目的,并且也不依赖于该 native 方法的客户端支持。

这是我所拥有的 jsbin:http://jsbin.com/zepaju/6/edit?js,console

感谢您的帮助!

最佳答案

这是一个相当大的主题,因为没有一种完美的方法可以让 JavaScript 像 Java 一样工作——你总是需要发明一些新的编码习惯,而且不同的人有不同的偏好。

查看链接的代码,很难确定您要做什么,但看起来问题在于您将对象的原型(prototype)视为“类”,它被复制到每个“实例”中(就像在 Java 中一样)——事实并非如此。

您的 create() 函数通过执行 Object.create(Poll) 创建每个“实例”,这会创建一个以 Poll 对象作为其的新对象原型(prototype)。当您引用结果对象的属性时,并且这些属性没有直接在对象上定义,您得到的是对单个 Poll 对象的属性的引用。

您已将 Poll 对象的内部变量密封在闭包中这一事实对此没有任何影响;闭包变量对外界是隐藏的,但它们可以被 Poll 对象的方法访问,并且这些方法在所有“实例”之间共享。

如果您想要一个函数使用一组特定的方法吐出对象,并将其内部数据隐藏在闭包中,则可能如下所示:

function Poll(challenger,incumbent) {
var challengerVotes=0;
var incumbentVotes=0;
return {
voteForChallenger: function() {challengerVotes++},
voteForIncumbent: function() {incumbentVotes++},
winner: function() {return challengerVotes>incumbentVotes ? challenger : incumbent}
}
}

var poll1 = Poll("Edward","Jacob");
var poll2 = Poll("Vanilla","Stilton");

poll1poll2 不会相互影响,并且除了通过提供的方法之外,无法访问其中任何一个的投票计数。我很高兴您正在寻找一种更通用的方法,但这是您可以如何开始的示例。

关于javascript - 如何在javascript中获取真正的取消引用的对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24462497/

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