【问题标题】:Distinct javascript objects with equal properties (names)具有相同属性(名称)的不同 javascript 对象
【发布时间】:2016-01-04 13:19:46
【问题描述】:

即使javascript 中没有“真实”对象,我仍在努力使它们彼此不同。

例如,我有两个对象 AppleOrange 定义如下:

function Apple(){
    this.name = "Apple";
}

function Orange(){
    this.name = "Orange";
}

OOP 的角度来看,两个name 属性没有关联,因为它们是不同类的属性。

我的问题/问题是,在重命名 class Apple 的 name 属性时,ReSharper 还会要求我重命名 Orange 类的属性。 同时按 F12 (GOTO DEFINITION) 将显示这两个属性。

但是为什么呢?它们是在全局范围内定义的吗?我怎样才能区分它们,所以 Orange 和 Apple 是真正不同的对象?

【问题讨论】:

  • 这似乎是 ReSharper 的问题,而不是您的代码。在 JS 中,这些类的对象是完全不同的:jsfiddle.net/16owh01o/3
  • 也就是说,除非您将函数作为函数而不是通过构造函数调用:Orange(); Apple(); 在这种情况下,两者都将写入全局范围,因为 this 将引用全局对象(通常是window)。也许 reshaper 会对你的函数使用做出假设。
  • @nils:所以我可以尝试不让它们在全局范围内吗?不知道你说的unless your are calling your functions as functions and not via a constructor是什么意思
  • 如果你按照 Lucas S. 建议的方式使用它们(即 var myOrange = new Orange(); 而不是仅仅调用 Orange();),你应该没问题。这样,this 将引用您的新对象 myOrange

标签: javascript class oop resharper


【解决方案1】:

ReSharper 无法提前知道您将如何使用函数“Apple”和“Orange”。这就是为什么它会搜索某个符号的所有可能的动态用法。让我们考虑以下示例:

function Apple(){
    this.name = "Apple";
}

function Orange(){
    this.name = "Orange";
}

var x = {name: "Tomato" };

Apple.call(x);

alert(x.name);

Orange.call(x);

alert(x.name);

如果您将名为“name”的项目之一重命名为不同的名称,但将其他项目的名称保留为“name”,则您的代码将被破坏。所以,重命名它们是有意义的。

这就是 ReSharper 在这种情况下列出所有三种用法的原因,您可以根据代码的确切语义来决定要重命名哪些以及保留哪些原样。

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多