一个雷风暴雨的下午,刚毕业的我来到一家面试公司面试
面试开始
面试官:做一个简单的验证表单功能任务
很简单,开始写
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 天 点击查看活动详情