识别Javascript对象

时间:2011-07-12 02:37:50

标签: javascript

我在识别javascript对象时遇到问题

function A(x, y){

    this.boo = function(){
    }
}
var aa = new A("1", "2");
aa.boo();

在代码中,'aa'是一个javascript对象吗?它是否也从object.prototype继承属性?如果是,我怎么能确定(来自新手)。

5 个答案:

答案 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();
}