0

所以假设你有一个非常基本的 person 对象,它有两个值和一个函数:

function personObject() {
    this.name = 'First Name';
    this.placeInLine = 1;
    this.setPlaceInLine = function(place) {
        this.placeInLine = place;
    }
}

我们设置了一些这样的变量:

var john = new personObject();
var bill = new personObject();
var message = "";

现在看看下面的三个代码片段......

---代码#1---

if(john.placeInLine < bill.placeInLine) message = "John is before Bill";
else message = "John is not before Bill";

结果:消息=“约翰不在比尔之前”;// 因为 1 不小于 1

---代码#2---

bill.setPlaceInLine(2); // change Bill's place to 2 (instead of default of 1)
if(john.placeInLine < bill.placeInLine) message = "John is before Bill";
else message = "John is not before Bill";

结果:消息=“约翰在比尔之前”;// 因为 1 小于 2;

---代码#3---

if(john.placeInLine < bill.setPlaceInLine(2)) message = "John is before Bill";
else message = "John is not before Bill";

结果:消息=“约翰不在比尔之前”://为什么?

比较后是否调用了 .setPlaceInLine 函数?或者运行该函数的行为是否返回了与 john.placeInLine 进行比较的内容?

4

3 回答 3

8

因为setPlaceInLine方法没有显式返回,因此返回undefined。并1 < undefined评估为false:undefined转换为Number, give NaN, 并且1 < NaN肯定是false( 1 > NaNis falsetoo, btw)。

虽然您可以通过让您的 setter 方法返回分配的值来解决此问题:

PersonObject.prototype.setPlaceInLine = function(place) {
  return this.placeInLine = place;
}

...我认为单独使用 setter 和 getter 会更好(更干净)(就像在您的代码 #2 示例中一样)。

作为旁注,我建议使用原型来设置对象方法(就像我在示例代码中所做的那样)。其原因在这个答案中得到了很好的解释:基本上,使用原型,您将只创建一个 Function 实体,供所有创建的对象使用,而this.someMethod每次调用构造函数时,您都会创建一个新的 Function 实体。

于 2012-10-22T15:14:44.887 回答
1

您正在与函数的返回值进行比较。

除非您实际上通过return this.placeInLine;它返回一个值,否则它将与undefined始终导致的false.

将您的代码更改为:

this.setPlaceInLine = function(place) {
    return this.placeInLine = place;
}
于 2012-10-22T15:16:34.533 回答
-1

setPlaceInLine 不返回任何内容。并且没有任何东西被评估为小于 1。您可以更新 setPlaceInLine 以返回值:

function personObject() {
    this.name = 'First Name';
    this.placeInLine = 1;
    this.setPlaceInLine = function(place) {
        this.placeInLine = place;
        return place;
    }
}
于 2012-10-22T15:16:44.407 回答