JavaScript在方法中使用构造函数参数,哪种方法有效?

JavaScript在方法中使用构造函数参数,哪种方法有效?,javascript,Javascript,我有这样的js对象: var Dog = function(dogName) { this.bark = function() { console.log(dogName + " is barking"); } } 及 我可以用同样的方法使用这两种方法: var puppy = new Dog("Ringo"); puppy.bark(); 我的问题是这两种方法之间有什么实际的区别吗?将构造函数参数分配给this.更好,还是我可以直接利用这些参数,因为它们可以被内部函数访问?

我有这样的js对象:

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

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

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

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

最大的区别是参数
dogName
在功能上的作用域是您内联声明的内容——它在功能上是私有的。此外,如果通过实例(如puppy)更改值,则不会更改函数输出

例如,如果我这样做:

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


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

区别在于当您说

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
有效地私有化,以便在初始化后无法访问或更改,则应使用第一种方法,否则应始终使用第二种方法。

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

在第二个版本中,
dogName
公开显示为
object.dogName

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