【发布时间】:2016-12-16 03:48:43
【问题描述】:
简单的问题。我为什么要这样做……
var Person = function(name) {
this.name = name;
this.sayHello = function(){
console.log('Hello, my name is ' + this.name); // <--
}
};
而不是...
var Person = function(name) {
this.name = name;
this.sayHello = function(){
console.log('Hello, my name is ' + name); // <--
}
};
我没有发现他们行为不同的情况。
【问题讨论】:
-
您不必这样做。在此示例/上下文中也是如此。为什么你认为你必须这样做?
-
var fred = new Person("Fred"); fred.name = "Frederick"; fred.sayHello()。查看Person对象的两个版本的作用。 -
好吧,在您的情况下,这并不重要,因为无论如何您都事先更新了类属性。但是我认为使用 this.name (如在类属性中)而不是变量会更好,因为该对象应该打招呼并声明其名称(如在对象名称中)。这也是在该类上定义的方法,因此它应该使用自己的属性。
-
这不是“最佳实践”——这两种用法是不同的。您可能想要传递一些东西并通过不公开它来保持它“不可变”,或者您可以传递一个值并期望它改变。但是,就像在你的第二个例子中一样,两者兼而有之,大多是荒谬的。如果您的对象中有一个字段,那么该字段应该很重要的期望。此外,您正在接受或回避
this的整个概念。这两种方法都有优点和缺点,并且取决于用例。碰巧你的实现有缺陷,没有省略this。 -
不,我指的是 second 示例。这是第二个示例的完整实现。您传入值
name,将其分配给名为name的对象字段,但随后您不使用该字段。那既不是这里也不是那里。示例 1 是一致的,因此为什么fred.name = "Frederick"会更改名称,而下一次调用sayHello()会打印出新名称。使用示例 2 的实现fred.name = "Frank"实际上不会更改报告的名称 - @Ayan 显示的内容。因此,简而言之,对于示例二,更改name不会更改名称。正如我所说 - 有缺陷。
标签: javascript oop constructor