对象的三个属性

  1.原型属性

  通过对象直接量创建的对象使用Object.prototype作为它们的原型;

  通过new创建的对象使用构造函数的prototype属性来作为它们的原型;

  通过Object.create()来创建的对象使用第一个参数作为它们的原型。

  在ECMAScript5中将对象作为参数传入Object.getPrototypeof()可查询它的原型;

  在ECMAScript3中没有与之等价的函数,但通常使用o.constructor.prototype来检测一个对象的原型。

  通过new创建的对象通常继承一个constructor属性,这个属性指代创建这个对象的构造函数。

  想要检测一个对象是否是另一个对象的原型(或处于原型链中),使用isPrototypeOf()。

  

var p = {x:1,y:2};
var o = Object.create(p);
p.isPrototypeOf(o);//true
Object.prototype.isPrototypeOf(o);//true

  2.类属性

  只能通过toString()这种间接的方法查询对象的类信息。该方法返回如下格式的字符串:

  [object class]

  提取返回的第八个和倒数第二个位置之间的字符即得到类信息。

  很多对象继承的toString方法被重写过,因此必须间接的调用Function.call()方法:

  

function classOf(o){

    if(o === null) return "null";
    if(o === undefined) return "undefined";
    return Object.prototype.toString.call(o).slice(8,-1);
}

classOf([]);//Array

classOf({});//Object

classOf("");//String

classOf(1);//Number

classOf(true);//boolean

classOf(window);//global

function f(){};

classOf(new f());//Object

classOf(f);//Function

  3.可扩展性

  对象的可扩展性用以表示是否可以向对象添加新属性。Object.isExtensible()判断对象是否是可扩展的。Object.preventExtensions()可将对象转换为不可扩展的,一旦对象转换成不可扩展的了就不能转回可扩展的了。Object.seal()不仅可以将对象转换成不可扩展的,而且还将对象的所有自有属性设置为不可配置的。也就是说它已有的属性不能删除或配置,但它已有的可写属性依然可以配置。

  var o = Object.seal(Object.create(Object.freeze({x:1}),{y:{value:2,writable:true}}));//创建一个封闭对象,包括一个冻结的原型和一个不可枚举的属性

原文地址:https://www.cnblogs.com/rellame/p/5026098.html