2

我有这样的js对象:

var Dog = function(dogName) {
  this.bark = function() {
    console.log(dogName + " is barking");
  }
}

var Dog = function(dogName) {
  this.dogName = dogName;
  this.bark = function() {
    console.log(this.dogName + " is barking");
  }
}

我可以同时使用这两种方法:

var puppy = new Dog("Ringo");
puppy.bark();

我的问题是这两种方法之间有什么实际区别吗?将构造函数参数分配给更好this.<field>,还是我可以直接使用这些参数,因为它们可以被内部函数访问?两者都有什么特殊情况吗?

4

3 回答 3

4

最大的区别是参数dogName的功能范围是您声明的内联 - 它在功能上是私有的。此外,如果您通过实例(如小狗)更改值,它不会更改函数输出。

例如,如果我这样做:

Dog.prototype.bark2 = function() { console.log(dogName); }

这将失败,因为它超出了范围。但是添加它可以this让我访问,所以我可以做到console.log(this.dogName)。再说一次,这实际上是关于范围以及您希望如何使用它。

于 2012-12-06T21:19:52.253 回答
2

不同的是当你说

var puppy = new Dog("Ringo");
puppy.dogName = "George";
puppy.bark();

在第一种方法中,它仍将使用名称“Ringo”,而在第二种方法中,它将显示“George”。出于同样的原因,如果你试图说

var puppy = new Dog("Ringo");
console.log("created new puppy: " + puppy.dogName);

这将适用于第二个版本,但不适用于第一个版本。因此,如果您的目标是dogName有效地将其设为私有,以便在初始化后无法访问或更改它,您应该采用第一种方法,否则始终采用第二种方法。

于 2012-12-06T21:20:15.297 回答
0

在第一个版本中,dogName是私有的 - 无法检查对象并找到该变量的值。调用可以推断bark,但不能直接看到;只有在该function表达式中声明的代码才能看到它。

在第二个版本中,dogName公开可见为object.dogName.

于 2012-12-06T21:20:22.923 回答