/**
* 返回一个对象的类型
*/
function getType(x) {
//不能!x,因为"",0,false
if (null == x)
return "null";
//注意:typeof对j引用类型对返回object
var t = typeof x;
if (t != "object")return t;
//有的对象可能重写了toString方法,所以需要调用对象最原始的toString()
var s = Object.prototype.toString.call(x),
s = s.substring(8, s.length - 1);
//注意:==“Object”的时候需要判断具体的类型。
if (s != "Object")return s;
var x_constructor = x.constructor;
//x.constructor:即创建x对象的方法
if (x_constructor == Object)return s;
//一个对象的构造函数的原型对象中如定义有className属性(原本不存在的,这是用户您自己定义的属性),则返回这个属性的值
// function X(x,y,z){
// this.x=x;
// }
// X.prototype.className="X";
// var x=new X(1,2,3);
// alert(x.constructor.prototype== X.prototype)//return true.
var x_cons_proto = x_constructor.prototype;
if ("className" in x_cons_proto && typeof x_cons_proto.className == "string") {
return x_cons_proto.className;
}
//返回构造函数的名称
//但是只对于使用函数定义方式声明的函数有效,如:
//function ClassA(){this.x="ss"} var a=new ClassA(); alert(getType(a));
if ("name" in x_constructor && "" != x_constructor.name)return x_constructor.name;
/*下面都是闭包的情况*/
//对与调用Function构造的方式创建的对象,则
var c = x_constructor.toString(), c = c.substring(8, c.indexOf("(")).replace(/(^\s*)|(\s*$)/g, "");
//对于new方法直接量方式创建的对象,则暂时无能为力
if ("" == c) {
return "The object created by a anonymous function.";
}
return c;
}
/**
* 测试
*/
var printFunc = function() {
//--------------------------------------------------------------
//--------------------------------------------------------------
var k; //<br>
document.writeln(getType(k));
k = "";
document.writeln(getType(k));
k = 23;
document.writeln(getType(k));
k = true;
document.writeln(getType(k));
k = new Date();
document.writeln(getType(k));
k = /\s/;
document.writeln(getType(k));
document.writeln("<br>");
document.writeln("<br>");
document.writeln("<br>");
//--------------------------------------------------------------
//--------------------------------------------------------------
function Outer(x) {
var x = x;
//... ...
return function() {
return x;
}
}
document.writeln(getType(Outer));
var o = Outer(98);
document.writeln(getType(o));
var o = new Outer;
document.writeln(getType(o));
var o = new Outer(33);
document.writeln(getType(o));
document.writeln("<br>");
document.writeln("<br>");
document.writeln("<br>");
//--------------------------------------------------------------
//--------------------------------------------------------------
function Outer2(x) {
this.x = x;
//... ...
this.getX = function() {
return x;
}
}
document.writeln(getType(new Outer2(99)));
document.writeln("<br>");
document.writeln("<br>");
document.writeln("<br>");
//--------------------------------------------------------------
//--------------------------------------------------------------
function Outer3(x) {
this.x = x;
//... ...
this.getX = function() {
return x;
}
return x;
}
document.writeln(getType(new Outer3(92)));
document.writeln("<br>");
document.writeln("<br>");
document.writeln("<br>");
//--------------------------------------------------------------
//--------------------------------------------------------------
function MyClass(x, y) {
this.x = x;
this.y = y;
}
//MyClass.prototype.className = "MyClass"; //自定义一个属性,表示类型,则会提高执行效率
//MyClass.prototype.constructor = MyClass;
MyClass.prototype.getSum = function() {
return this.x + this.y;
};
var mc = new MyClass(2, 5);
document.writeln(mc.getSum());
document.writeln(getType(mc));
document.writeln("<br>");
document.writeln("<br>");
document.writeln("<br>");
//--------------------------------------------------------------
//--------------------------------------------------------------
var MyClass3 = function(x, y) {
this.x = x;
this.y = y;
}
//MyClass.prototype.className = "MyClass";
//MyClass.prototype.constructor = MyClass;
MyClass3.prototype.getSum = function() {
return this.x + this.y;
};
mc = new MyClass3(1, 5);
document.writeln(mc.getSum());
document.writeln(getType(mc));
document.writeln("<br>");
document.writeln("<br>");
document.writeln("<br>");
//--------------------------------------------------------------
//--------------------------------------------------------------
var MyClass2 = Function("x", "y", "this.x = x;this.y = y;");
MyClass2.prototype.getSum = function() {
return this.x + this.y;
};
mc = new MyClass2(3, 5);
document.writeln(mc.getSum());
document.writeln(getType(mc));
}
printFunc();
//document.writeln("<br>");
//document.writeln(printFunc);
javascript判断 对象 类型
最新推荐文章于 2022-05-25 11:08:22 发布