Javascript 我是否正确地编写了JS面向对象代码?

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

一般来说,我对Javascript和面向对象编程是新手。我想知道在编写JS OOP代码时是否遵循了最佳实践

在这里,我创建了一个名为_name的类,并为它提供了一些属性和一个this.details对象。然后我使用原型为类创建方法

//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'
    绝对是不洁的ಠ_ಠ