Javascript学习笔记——6.8 对象的三个属性

每一个对象都有与之相关的原型(prototype),类(class)和可扩展性(extensible attribute).

原型属性

对象的原型属性是用来继承属性的.我们经常把对象的原型属性简称为对象的原型.

  • 通过对象直接量创建的对象,它的原型是Object.prototype
  • 通过new创建的对象,它的原型是构造函数原型
  • 通过Object.create()创建的对象,它的原型是Object.create()接收的第一个参数(可以是null)

获取对象的原型属性 Object.getPrototypeOf()

检测一个对象是否在另一个对象的原型链中,使用isPrototypeOf()

var p = {name:'Mike',age:18}
var p1 = Object.create(p)
p.isPrototypeOf(p1) //true

类属性

对象的类属性是一个字符串,表示对象的类型信息.但是ECMA5并未提供设置这个属性的方法,而且只能通过toString()并截取第8个到倒数第2个字符的方式间接的查询它.但很多对象的toString方法重写了,所以得调用Function.call()方法实现.以下函数可以获取class

//获取对象类属性的函数
function classof(o){
  if(o===null) return 'Null'
  if(o===undefined) return 'Undefined'
  return Object.prototype.toString.call(o).slice(8,-1)
}

可扩展性

对象的可扩展性表示是否可以给对象添加新属性.所有的内置对象和自定义对象都是可扩展的,除非修改它们的可扩展属性.可扩展性的目的是将对象锁定,避免外界的干扰.

  • 通过Object.isExtensible()判断对象是否可扩展
  • 通过Object.preventExtensions()将对象设置为不可扩展.一旦对象设置为不可扩展的,就无法再转换为可扩展的.

preventExtensions()只影响对象本身的可扩展性.如果给一个不可扩展的对象的原型添加属性,这个不可扩展对象同样会继承新添加的属性.

封闭对象

  • 通过Object.seal()可以将对象设置为不可扩展,同时所有自有属性被设置为不可配置的.封闭后的对象不可再解封
  • 通过Object.isSealed()可以检测对象是否被封闭

冻结对象

  • 通过Object.freeze()可以将对象设置为不可扩展,属性设置为不可配置,数据属性设置为只读.(如果有存取器属性有setter,依然可以被赋值)
  • 通过Object.isFrozen()可以查询对象是否被冻结

Object.preventExtensions() Object.seal() Object.freeze()都返回传入的对象,所以可以嵌套使用.

你可能感兴趣的:(Javascript学习笔记——6.8 对象的三个属性)