我在识别javascript对象时遇到问题
function A(x, y){
this.boo = function(){
}
}
var aa = new A("1", "2");
aa.boo();
在代码中,'aa'是一个javascript对象吗?它是否也从object.prototype继承属性?如果是,我怎么能确定(来自新手)。
答案 0 :(得分:4)
您可以放心,因为每一个原生对象从的的Object.prototype 的继承(除的全球的对象,其[[Prototpye]是依赖于实现的,但它在大多数浏览器中都是Object的实例。)
一些澄清。
原生对象是使用ECMAScript构建的对象,例如
function foo() {}
var obj = {};
var arr = [];
等等。它们都具有的的Object.prototype 的自己的[[原型]]链,这使得它们的对象(和任何其他构造函数的原型是上链)的实例。 ECMAScript对象可以从多个原型继承,因此是多个对象的实例:
function Foo(){}
Foo instanceof Function; // true
Foo instanceof Object; // true
var foo = new Foo();
foo instanceof Foo; //true
foo instanceof Object; //true
内置对象是ECMAScript提供的对象,例如
Global instanceof Object; // might be true
Array instanceof Object; // true
Math instanceof Object; // true
Object instanceof Object; // true - Object is an Object :-)
Date instanceof Object; // true
Function instanceof Object; // true
等等。以上大多数也是函数(包括函数)的实例。
主机对象是主机环境提供的对象,例如DOM中的所有对象,例如。
document
document.createElement
window
var element = document.createElement('img');
var nodeList = element.getElementsByTagName();
等等。这些对象只需要遵循ECMAScript中最基本的规则,他们不需要有任何的继承模型,当用简单的的instanceof 的测试,甚至可能引发错误或的typeof 的运营商(这是一种讨厌的行为,但是某些浏览器的某些版本会这样做 - 许多IE主机对象实现为ActiveX控件,因此它们在try..catch块中创建)。
读取的 “本机的ECMAScript对象” 的部分(ES 3)和 “标准内置的ECMAScript对象”(ES 5)在本说明书中的对象(ECMA-262),这一切都在那里。
答案 1 :(得分:1)
在代码中,'aa'是一个javascript对象吗?
是。或者更确切地说,aa
是引用 JavaScript对象的变量。
它是否也从object.prototype继承属性?
来自Object.prototype
,是的。 (资本化在JavaScript中很重要,因为它区分大小写。)
如果是,我怎么能确定(来自新手)。
我不太确定你的意思。在JavaScript环境中,有主机对象(the spec的第4.3.8节)和本机对象(第4.3.6节)。本机对象都继承自Object.prototype
。主机对象可能会也可能不会。
有很多方法可以查询对象以找出它“是什么”。我在my blog post "Say what?"中概述了其中几个,但总结一下:
typeof
,但是关于对象,它所说的只是“对象”(主机或本机),所以如果你想了解更多关于它是什么类型的对象,这并不是非常有用。instanceof
,可用于检查对象是否是通过特定构造函数创建的(例如if (obj instanceof Date)
)。Object.prototype.toString
有一个技巧,如果它是内置对象,它有时会为您提供有关您正在处理的本机对象的更具体信息(第4.3节) 0.7)。答案 2 :(得分:0)
您可以查看其类型:
if (typeof(aa) == "object") {
alert("It's an object!");
}
将导致警报,意味着它是一个对象,并且还有通过object.prototype扩展的任何方法
答案 3 :(得分:0)
结合前两条评论:
http://jsfiddle.net/jfriend00/x58w8/
function A(x, y){
this.boo = function(){
}
}
Object.prototype.foo = function() {};
var aa = new A("1", "2");
aa.boo();
alert(typeof aa); // alerts object
alert(typeof aa.foo); // alerts function
答案 4 :(得分:0)
这就是我使用的
if( Object.prototype.toString.call( aa ) === '[object Object]' )
{
doSomething();
}