javascript - JS对象实例化的时候,event做了什么?
本文介绍了javascript - JS对象实例化的时候,event做了什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
JS对象实例化的时候,event做了什么?
之前使用对象都是这样:
//构造函数
function Test(foo){
this.foo = foo;
alert(this.foo);
}
//实例化
var ale = new Test("Holle!");//传入foo实参
然后发现构造函数可以不使用形参,而用event对象直接调用
//构造函数,不使用形参
function Test2(e){
this.foo = e.foo;
alert(this.foo);
}
//实例化
var ale2 = new Test2({foo: "Hello Again!"});
event对象代表事件状态,但是实例化对象时event具体做了什么?有点转不过来
还可以再简化一下。。我只要知道event做了什么
//构造函数,不使用形参
function Test3(e){
alert(e.foo);
}
//实例化
var ale3 = new Test3({foo: "Hello Again2!"});
解决方案
看到这是两天前的邀请,不过既然没有满意答案,我来解释下你遇到了什么样的问题
首先,你定义了一个带有一个参数的构造函数
function Test(foo) {
// ......
}
这个构造函数定义为需要一个参数,内部会对这个参数进行处理。同时,你希望这个参数是一个字符串(姑且这么猜想),这样通过 this.foo = foo
可以给字段 foo
赋予一个字符串值。然而,问题出现了
JavaScript 的变量是不指定类型的,参数也是一样。你希望的类型并不一定是用户(指调用者)构造的时候传入的类型。你这里希望用户传入字符串,但实际用户传入了一个对象,甚至也有可能是一个数组,或者函数,总之,你根本不能确定用户输入什么,就像这些:
// 传入对象
new Test({ name: "hello" });
// 传入数组
new Test([1, 2, 3, 4, 5]);
// 传入函数
new Test(function() {
console.log("hello world");
});
// 啥都不传入
new Test();
既然不能确定用户会传入啥,那现在有两个方案
文档中清楚的说明需要传入字符串参数,实际处理的时候把参数当成是字符串值处理
检查用户传入的参数是什么,分别进行处理
第一种方案容错极差,所以不讨论它。我们来说说第二种方案。
对于可以想像的一些情况,进行处理,比如
function Test(foo) {
switch (typeof foo) {
case "string":
// 如果传入的 foo 是个字符串,符合预期
this.foo = foo;
break;
case "function":
// 如果传入的 foo 是个函数,取其运算结构
this.foo = foo();
break;
case "object":
// 如果是个对象(注意,有可能是 null)
// 取其 foo 值,没有则用默认值代替
this.foo = (foo || {}).foo || "";
break;
default:
// 其它情况用默认值代替
this.foo = "";
break; // 这个 break 可以不要,我按 C# 习惯写的
}
}
这个容错性就比较好了,但是仍然会有一些漏洞,比如 typeof foo === "function"
的时候,取其结果,但其结果的类型仍然是不确定的。如何处理这个问题你可以参照着自己想办法了,一般不需要搞得太复杂,结合文档加部分容错就可以处理绝大多数的情况
这篇关于javascript - JS对象实例化的时候,event做了什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文