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