在下面的constructor function
中,我没有为每个属性声明一个新变量。相反,我为每个属性使用了this
关键字。例如,我没有声明var species;
,而是在函数内部使用this.species
。这适用于chrome,它使我不必声明一堆变量。但有一个明显的原因是我不应该以这种方式创建constructor function
属性吗?它是否被认为是草率的,还是在业界普遍不赞成?
'use strict';
var zombie;
const Creature = function() {
this.species = null;
this.action = null;
this.story = function() {
console.log("The " +this.species +" is about to " +this.action +".");
}
}
zombie = new Creature();
zombie.species = "zombie";
zombie.action = "strike";
zombie.story();

答案 0 :(得分:1)
不仅如此,这是正确的方法。在构造函数中声明变量只会使它们成为构造函数中的变量,它不会使它们成为实例的属性。您正在做什么 使它们成为属性,并且是正确的(并且得到IDE代码完成的良好支持;例如,稍后如果您键入zombie.
,则IDE知道zombie
}可能有species
,action
和story
,并且可以自动建议它们。
有点切向,但除非你有充分的理由为每个实例创建单独的story
函数,否则将它放在将被指定为新对象原型的对象上:
const Creature = function() {
this.species = null;
this.action = null;
};
Creature.prototype.story = function() {
console.log("The " +this.species +" is about to " +this.action +".");
};
如果您正在使用构造函数,因为您已经在使用ES2015 +功能(const
),您可以考虑使用class
:
class Creature {
constructor() {
this.species = null;
this.action = null;
}
story() {
console.log("The " +this.species +" is about to " +this.action +".");
}
}
...因为它更简洁,更具说服力。此外,它会阻止您在没有Creature
的情况下调用new
。
另外,而不是
zombie = new Creature();
zombie.species = "zombie";
zombie.action = "strike";
...您可以在构造函数中初始化这些属性:
class Creature {
constructor(species, action) {
this.species = species;
this.action = action;
}
story() {
console.log("The " +this.species +" is about to " +this.action +".");
}
}
然后:
zombie = new Creature("zombie", "strike");
(社区维基,因为这主要是对问题的评论所说的,只是扩展了一点。)
答案 1 :(得分:1)
你应该使用构造函数来传递这些值,而不是在之后执行:
'use strict';
var zombie;
const Creature = function(species, action) {
this.species = species;
this.action = action;
this.story = function() {
console.log("The " +this.species +" is about to " +this.action +".");
}
}
zombie = new Creature("zombie", "strike");
zombie.story();
原因是当其他人使用您的课程时,如果他们滥用您的课程,IDE会给出明确的指示或显示警告。如果团队合作或生成供他人使用的代码,则要求您的类使用得到明确定义和清晰。这个例子显然是人为的,但是story()函数的使用似乎期望设置这两个属性,因此在构造时应该是必需的。
答案 2 :(得分:0)
你必须小心引用'this'。虽然您知道构造函数中的“this”是什么,但您知道它在对象的方法中是什么吗?如何在对象外部调用该方法?在ecmascript5中,我总是在对象的闭包中创建一个成员'self',并在构造函数中将它赋给self。这样我总是知道自己在其他方法中所指的是什么。 e.g。
const Creature = function(species, action) {
var self = this;
self.species = species;
self.action = action;
self.story = function() {
console.log("The " +self.species +" is about to " +self.action +".");
}
}
请参阅此答案,了解其在javascript How does the "this" keyword work?
中的工作原理妙语是'this'绑定到调用者的范围。因此,它并不总是意味着包含对象的实例,就像在Java中一样。