每一个对象都有与之相关的原型(prototype)、类(class)和可扩展性(extensible attribute)。
原型属性
原型属性是再实例对象创建之初就设置好的,通过对象直接量创建的对象使用Object.prototype作为它们的原型。通过new创建的对象使用构造函数的prototype属性作为它们的原型。通过Object.create()创建的对象使用第一个参数(也可以是null)作为它们的原型。
<script type="text/javascript">
//检测一个对象是否是另一个对象的原型(或处于原型连中)
var p = {x:1}; //定义一个原型对象
var o = Object.create(p); //使用这个原型创建一个对象
p.isPrototypeOf(o); //true:o继承自p
Object.prototype.isPrototypeOf(o); //true:p继承自Object.prototype
</script>
类属性
对象的类属性(calss attribute)是一个字符串,用以表示对象的类型信息。
<script type="text/javascript">
function classof(o){
if(o === null) return "Null";
if(o === undefined) return "Undefined";
return Object.prototype.toString.call(o).slice(8,-1);
}
classof(null); //"Null"
classof(1); //"Number"
classof(" "); //"String"
classof(false); //"Boolean"
classof({}); //"Object"
classof([]); //"Array"
classof(/./); //"Regexp"
classof(new Date()); //"Date"
classof(window); //"Window" 这是客户端宿主对象
function f(){};//自定义一个构造函数
classof(new f()); //"Object"
</script>
可扩展性
<script type="text/javascript">
//通过将对象传入Object.esExtensible(),来判断该对象是否可扩展
//如果项将对象转换为不可扩展的,需要调用Object.preventExtensions(),将待转换的对象作为参数传进去
//Object.seal()封闭对象。不能给这个对象添加新属性,而且已有属性也不能删除
//...
</script>