标签:
JS对象类别
对象的构成
属性
按继承区分
按类别分
var o = {
get name() {},
set name(value) {},
}
三个对象特性
属性特性
属性描述符
//返回 {value:1,writable:true,enumrable:true,configurable:true}
Object.getOwnPropertyDescription({x:1},"x");
//对于不存在的属性和继承属性返回undefined
设置属性特性
var o = {};
Object.defineProperty(o,"x",{value:1,writable:true,
enumrable:false,configurable:true})
//修改为只读
Object.defineProperty(o,"x",{writable:false});
o.x = 2;//error
//但是属性依然是可配置的,所以可以这样修改x的值
Object.defineProperty(o,"x",{value:2});
属性操作
检测属性
//in操作符
var o = {x:1};
"x" in o;//会从自有属性和继承属性中判断
o.hasOwnProperty("x");//只会检测自有属性
o.propertyIsEnumerable("x");//检测自有属性,且可枚举性为true,可枚举性是属性特性之一
对象原型
每一个js对象都有一个原型对象(null以及Object.prototype除外)
var a = new Object();
var a = {};
//两种方式的原型都是Object.prototype
//此处的Object并不是 java等语言中 类的概念,而是Object构造函数
原型对象是类的唯一标示
var o = {x:1,y:1};
function A {
}
A.prototype = o;
function B {
}
B.prototype = 0;
new B() instanceof A// true 虽然new A() 和 new B()是不同的构造函数产生的,但是他们的原型都是o
Object.create() 一个静态函数,有两个参数,第一个为创建对象的原型
var o1 = Object.create({x:1,y:2});//继承了属性x,y
var o2 = Object.create(null);//创建一个没有原型的对象,没有任何方法,包括toString
var o3 = Object.create(Object.prototype);//同 var a = {}
constructor 属性
每一个函数的prototype对象都有一个constructor属性
var F = function f(){}
var p = F.prototype;
var c = p.constructor;
c === F;
构造函数也一样
var o = new F();//o 继承了 F.prototype
o.constructor === F;//true
对象的可拓展标记
Object.isExtensible(o);//判断对象是否可拓展
Object.preventExtensions(o);//设置为不可拓展,该过程不可逆,但是给o的原型增加属性,o仍然可以继承这些属性
Object.isSealed(o);
Object.seal(o);//不可拓展,并设置自有属性为不可配置
Object.isFrozen()
Object.freeze();//不可拓展,并设置自有属性为不可配置,属性设置为只读,setter 属性不受影响
对象序列化 就是转换成JSON字符串
JSON.stringify(o);
JSON.parse();
类和类型
typeof //对于对象都返回Object
function classof(o) {
return Object.prototype.toString.call(o).slice(8,-1);
}//可以返回内置对象的具体类型 比如Date RegExp等
以上两种方法都有局限性,那么如何获得自定义对象的类型呢
function typeAndValue(x) {
if(x == null)return "";
switch(x.constructor) {
case Number:return "Number:"+x;
case Complex:return "Complex:"+x;//处理自定义类型
}
}
标签:
原文地址:http://blog.csdn.net/u013720825/article/details/51348212