【问题标题】:Some questions about OOP关于OOP的一些问题
【发布时间】:2013-05-10 00:33:45
【问题描述】:

我有一个叫做时钟的对象。

我有一个称为时间的对象的方法。

如果我在 time 方法中使用 this.propertyName,这会将属性赋予我的时钟对象,对吗?但是如果有一个 if/else 语句(在 time 方法本身内),例如,它需要在之前运行 属性的值可以赋值吗?

if(t.getHours() >= 12){
        this.ap = "AM";
    }else{
        this.ap = "PM";
    }

所以,如果我使用像 this.ap = "hi" 这样的简单值,则可以正常工作。它将属性赋予我的对象。如果我有如上所示的语句,则该属性未定义。解决这个问题的最佳方法是什么?

另外,还有一个简单的问题,因为我才刚刚开始使用自己的对象。如果我有一个具有 3 个单独方法的对象,并且我想在 1 个方法中声明的所有方法中使用一个值,则将其分配为我的对象的属性允许我执行此操作。我说的对吗?

因此,如果我在一种方法中使用了 var property = "",那么在我的其他方法中访问它的唯一方法就是返回它。但是将属性设置为对象可以解决这个问题吗?我意识到我可以对此进行试验,但我宁愿只知道正确的方法。

编辑:这是一个例子。显然我误解了一些东西。我似乎无法从方法中定义属性。

var clock = {};

clock.test1 = "test 1.";

clock.time = function(){

    clock.test = "test 2."; 

    if(t.getHours() >= 12){
        clock.ap = "PM";
    }else{
        clock.ap = "AM";
    }

}

alert(clock.test1);  //success
alert(clock.test); //returns undefined
    alert(clock.ap);  //returns undefined

【问题讨论】:

  • 您需要展示更多代码。 this 的绑定在 JavaScript 中有点棘手。通常的解决方案是添加一个名为thatself 或类似于您的对象的属性,并在创建对象时为其分配this。这样,您始终可以引用对象本身。
  • => 是语法错误,应该是>=t.getHours 中的 t 是什么? (你确定getHours 不是一个函数,可以用t.getHours() 调用吗?)
  • ^感谢您指出这一点,我确实是想将 getHours 作为函数输入。
  • 好的。解决了这些问题,它应该可以工作。也就是说,如果 this.ap = "hi"; 有效,并且您将 if/else 结构 放在同一个地方,那么假设 t 在范围内并且是具有 getHours() 方法的对象,它也会起作用.如需更多帮助,请显示 if/else 出现的所有函数,并显示您如何调用该函数。
  • 关于您的编辑,您需要实际调用 clock.time() 函数,然后再尝试使用在该函数中创建的 clock.testclock.ap 等属性 - 该函数不会自动运行。 (而且您还没有解释 t 对象在 t.getHours() 中是什么 - 它是在哪里定义的?)

标签: javascript oop object methods properties


【解决方案1】:

避免绑定this 问题的常用方法是执行以下操作:

var MyObject = function() {
    var self = this;
    self.someProperty = "foo";

    self.someMethod() {
        self.someProperty = "bar";
    }
}

var anInstance = new MyObject();
console.log(anInstance.someProperty);      // foo
anInstance.someMethod();
console.log(anInstance.someProperty);      // bar

这避免了 this 与您预期的不同的问题,这可能取决于您调用方法的方式(例如,使用方法作为某些 DOM 事件的处理程序)。

此示例通过利用 closure 工作,这是 Javascript 中一个非常重要的概念,您应该阅读(谷歌它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2013-07-07
    • 2012-03-18
    • 2023-03-09
    • 2021-07-01
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多