Javascript 我是否正确地编写了JS面向对象代码?
一般来说,我对Javascript和面向对象编程是新手。我想知道在编写JS OOP代码时是否遵循了最佳实践 在这里,我创建了一个名为_name的类,并为它提供了一些属性和一个this.details对象。然后我使用原型为类创建方法Javascript 我是否正确地编写了JS面向对象代码?,javascript,oop,Javascript,Oop,一般来说,我对Javascript和面向对象编程是新手。我想知道在编写JS OOP代码时是否遵循了最佳实践 在这里,我创建了一个名为_name的类,并为它提供了一些属性和一个this.details对象。然后我使用原型为类创建方法 //define _name class (I use _ to easily recognize classes) function _name () { this.firstName = ''; this.lastName = ''; th
//define _name class (I use _ to easily recognize classes)
function _name () {
this.firstName = '';
this.lastName = '';
this.middleName = '';
this.details = {
eyeColor: '',
hairColor: ''
}
}
//begin _name methods
_name.prototype.getFullName = function() {
return this.firstName + ' ' + this.middleName + ' ' + this.lastName;
}
_name.prototype.setFirstName = function(firstName) {
if ($.trim(firstName).length && typeof firstName != 'not_defined') {
this.firstName = firstName;
} else {
alert('Please enter a valid first name.');
}
}
_name.prototype.setLastName = function(lastName) {
if ($.trim(lastName).length && typeof lastName != 'not_defined') {
this.lastName = lastName;
} else {
alert('Please enter a valid last name.');
}
}
_name.prototype.setMiddleName = function(middleName) {
if ($.trim(middleName).length && typeof middleName != 'not_defined') {
this.middleName = middleName;
} else {
alert('Please enter a valid middle name.');
}
}
_name.prototype.setHairColor = function(hairColor) {
this.details.hairColor = hairColor;
}
_name.prototype.setEyeColor = function(eyeColor) {
this.details.eyeColor = eyeColor;
}
//end _name methods
var personOne = new _name();
personOne.setFirstName('John');
personOne.setLastName('Doe');
personOne.setMiddleName('Barry');
personOne.setEyeColor('Brown');
personOne.setHairColor('Black');
document.write(personOne.getFullName());
document.write(personOne.details.eyeColor);
document.write(personOne.details.hairColor);
一些评论:
我使用u来轻松识别类
标准是为构造函数函数使用大写的名称。下划线用于暗示变量或属性的隐私,即它们是公共的,但不应使用
var personOne=new_name()代码>
personOne.setFirstName('John')代码>
personOne.set…
通常,您会对构造函数使用参数:
function Name (first, last, middle, eye, hair) {
this.firstName = first;
this.lastName = last;
this.middleName = middle;
this.details = {
eyeColor: eye,
hairColor: hair
}
}
var personOne = new Name('John', 'Doe', 'Barry', 'Brown', 'Black');
在初始化时,setter通常只被调用一次,因此您可以将它们的代码移动到construtor函数中。如果您计划更改属性,那么仍然可以使用构造函数中的验证逻辑调用setter函数
middleName的类型!='未定义'
无值变量的typeof
运算符的结果是“未定义”
。您还需要在修剪前检查
您的常规代码设计中也可能存在一些缺陷。如果对名字、中间名和姓氏使用相同的条件,则应该将它们移动到自己的validateString
函数中,该函数可以从单个setter(干代码)调用。同样,验证函数不应该给用户关于输入内容的反馈,它应该只返回false
“无效”。用户交互应该由同样处理您输入的模块完成,而不是在数据结构模块中。从总体上看,是的,您做得很好;不错。:-)考虑更多的信息和观点的例子。
有些指针与OOP无关,只是与JavaScript有关:
JavaScript中压倒性的惯例是构造函数函数(您的\u name
)最初是封顶的,例如name
(比如Date
或RegExp
)
以\u name.prototype.setLastName=function(){…}
形式分配的各种函数都是分配给具有名称的属性的匿名函数。为函数指定专有名称有助于工具的使用。有些引擎足够聪明,即使你没有给出函数名,也能解决这个问题,但有些引擎需要专有名称。有关示例和/或,请参见上面的链接
您依赖于所有函数赋值中的恐怖:\u name.prototype.setLastName=function(){…}
应该在}
后面以分号结尾。建议学习规则并始终明确提供分号;当引擎不得不猜测时,它可能会猜错,如果你不考虑它们,那么缩小/压缩/打包就会变得困难
> p>而不是写<代码>名称.TypType .Xyz =…在整个地方,考虑使用范围函数和缓存<代码>名称>原型< /COD>到一个更简单的符号,例如:
(function(p) {
p.setLastName = function() {
// ...
};
p.xyz = function() {
// ...
};
})(_name.prototype);
…或使用更进一步的辅助函数。只是为了减少击键次数和脚本大小
但总的来说,是的,你走在正确的轨道上
更多阅读:
我想你是想在每次出现“未定义的”
”时都加上“未定义的”
”…只是一个注释,通常构造函数都是大写的,这就是你知道它们是对象的构造函数的方式,所以名称应该是name。你可能需要遵循一些一般原则。首先,在setter函数中有alert()
语句可能被认为是一种“代码气味”。正如David所说,在测试'未定义的
'时,您可能是指'未定义的
——但在使用$.trim(blah).length检查修剪长度之前,您还应该进行未定义的
检查,我尝试了未定义的
,但似乎不起作用。在Inspect元素中,当我使用typeof
@Etcher时,属性值是未定义的
:'not\u defined'
绝对是不洁的ಠ_ಠ