刚毕业的我面试的第一家公司,叫我写验证表单功能

110 阅读3分钟

一个雷风暴雨的下午,刚毕业的我来到一家面试公司面试

面试开始

面试官:做一个简单的验证表单功能任务

很简单,开始写

function checkName () {
    // 验证姓名
}

function checkEmail () {
    // 验证邮箱
}

function checkPassword () {
    // 验证密码
}

面试官皱了眉头: "你创建了很多全局变量啊?"

面试官再说到: "在团队开发中,别人如果也定义了同样的方法就会覆盖掉原有的功能。如果你定义了很多方法,这样相互覆盖不容易察觉。你可以放一个变量保存,如果一旦覆盖,所有功能都会失效,现象明显,这样你也比较容易察觉。"

用对象收编变量

var CheckObject = {
    checkName: function () {
        // 验证姓名
    },
    checkEmail: function () {
        // 验证邮箱
    },
    checkPassword: function () {
        // 验证密码
    }
}

对象的另一种形式

var CheckObject = function () {}

CheckObject.checkName = function () {
    // 验证姓名
}
CheckObject.checkEmail = function () {
    // 验证邮箱
}
CheckObject.checkPassword = function () {
    // 验证密码
}

面试官: 同事也想用你写的对象方法时,你这个对象不能复制一份,或者说这个对象类在用new关键字创建新的对象时,新创建的对象是不能继承这些方法的。

函数对象

var CheckObject = function () {
    return {
        checkName: function () {
            // 验证姓名
        },
        checkEmail: function () {
            // 验证邮箱
        },
        checkPassword: function () {
            // 验证密码
        }
    }
}

同事要用,并且互不影响,他这样调用:

var a = CheckObject ()
a.checkEmail()

上面这种函数对象还不是真正意义上类的创建方式,并且创建的对象a和CheckObject没有任何关系。

再改造一下

var CheckObject = function () {
    this.checkName = function () {}
    this.checkEmail = function () {}
    this.checkPassword = function () {}
}

这个对象就是类了,既然是类,就用关键字new来创建,这样调用:

var a = new CheckObject()
a.checkEmail()

这样就可以用CheckObject类创建出来的对象了(这就是所谓的类实例化),每个人都有自己一套属于自己的方法。

面试官:通过this定义,每次new实例化,实例化出来的对象都会对类的this上的属性进行复制。虽说都有一套属于自己的方法,但是,有时候这么做是高消耗的。改造一下。

对象类原型链

var CheckObject = function() {}

CheckObject.prototype.checkName = function () {}
CheckObject.prototype.checkEmail = function () {}
CheckObject.prototype.checkPassword = function () {}

创建的对象所拥有的的方法就都是一个了。不过这样写很多遍prototype,改造一下。

var CheckObject = function() {}

CheckObject.prototype = {
    checkName: function () {},
    checkEmail: function () {},
    checkPassword: function () {}
}

这样调用:

var a = new CheckObject()
a.checkName()
a.checkEmail()
a.checkPassword()

还可以这样改造一下,实现连续调用。

var CheckObject = function() {}

CheckObject.prototype = {
    checkName: function () { return this },
    checkEmail: function () { return this },
    checkPassword: function () { return this }
}
var a = new CheckObject()

a.checkName().checkEmail().checkPassword()

再来

原生对象函数Function

Function.prototype.checkFn = function (name, fn) {
    this[name] = fn
}

var a = function() {} // 或者 var a = new Function()

a.checkFn('checkName', function () { ... })
a.checkFn('checkEmail', function () { ... })
a.checkFn('checkPassword', function () { ... })

再改造一下。

Function.prototype.checkFn = function (name, fn) {
    this[name] = fn
    return this
}

var a = function() {} // 或者 var a = new Function()

a.checkFn('checkName', function () { return this })
    .checkFn('checkEmail', function () { return this })
        .checkFn('checkPassword', function () { return this })

调用

a.checkName().checkEmail().checkPassword()

类式调用

Function.prototype.checkFn = function (name, fn) {
    this.prototype[name] = fn
    return this
}

var a = function() {} // 或者 var a = new Function()

a.checkFn('checkName', function () { return this })
    .checkFn('checkEmail', function () { return this })
        .checkFn('checkPassword', function () { return this })
        
var b = new a()

b.checkName().checkEmail().checkPassword()

梦一场

面试官哈哈大笑

突然,“交作业,快交作业”

啊,原来是一场梦

我起身,走出教室

今天是星期一,风和日丽

总结

人活到80岁是多少天?

百度: 29220天

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天 点击查看活动详情