JS原生提供Object对象,它的原生方法分为两类:Object本身的方法与Object的实例方法.
Object既可以当做普通方法用 Object(vars)目的是把vars转换为对象
转换规则:如果参数是对象则原样返回,如果是原始类型,则转换为各自对应的包装对象.
也可以当做构造方法使用 new Object();来生成新对象.用法与上面的普通方法调用相同.只不过语义不一样:
Object(value) 表示将 value 转成一个对象,而 new Object(value)表示新生成一个对象,这个新对象===value.
1.Object对象本身的方法
直接定义在Object中,
Object.print = function(o){console.log(o)} Object.keys(); Object.getOwnPropertyNames(); //一般来说上面两个方法都是返回自身属性名组成的数组 //只有涉及到不可枚举属性时,才用getOwnPropertyNames去获取不可枚举属性. Object.getOwnPropertyDescriptor();//获取属性的描述对象 Object.defineProperty(); Object.defineProperties(); Object.preventExtensions();//防止对象扩展 Object.isExtensiable(); Object.seal();//禁止对象配置 Object.freeze();//冻结对象 Object.isSealed(); Object.isFrozen(); Object.create();//指定原型对象和属性,返回一个新对象 Object.getPrototypeOf();//获取对象的Prototype对象
Object.prototype.print = function(){console.log(this)} let obj = new Object(); obj.print()// Object.prototype.valueOf(); Object.prototype.toString(); Object.prototype.toLocaleString(); Object.prototype.hasOwnProperty();//判断属性是否为自身属性 Object.prototype.isPrototypeOf(); Object.prototype.propertyIsEnumerable();
{ value:123, writable:false, enumerable:true, configurable:fale, get:undefined, set:undefined }
var obj={ $n:5, get next(){return this.$n} set next(n){ if(n>=this.$n) this.$n = n; else throw new Error('new value should bigger than old value'); } } obj.next//5 obj.next=10;
var extend = function (to ,from){ for(var property in from){ to[property] = from[property] } return to ; } extend({},{a:1})//{a:1}
var extend = function (to ,from){ for(var pro in from){ if(!from.hasOwnProperty(pro)) continue; Object.defineProperty( to, pro, Object.getOwnPropertyDescriptor(from,pro) ); } return to; }
同时,如果把对象的原型取出来,一样可以增加新属性.
以上三种方法只是对对象进行浅锁定,或者说如果对象中的属性值还是对象的话,只能锁定对应的指向,属性值指向的对象本身还是可以被改变的.
禁止对象添加新属性,同时禁止对象删除已有属性,也不允许修改属性值;
Object.freeze(obj);
相当于把属性描述对象中的configureable设置为false;
禁止对象添加新属性,同时禁止对象删除已有属性,但是属性值可以被修改;
Object.seal(obj);
禁止对象添加新的属性;
Object.preventExtension(obj);
5 对象的锁定
为了解决这个问题,可以通过 Object.defineProperty方法来拷贝属性.
上面方法的问题在于,如果遇到存取器属性,只会对相应的属性值进行拷贝
一般来说
4 对象的拷贝
存取器,往往用于 属性值依赖对象内部数据的场合
Object.getOwnPropertyDescriptor(obj,'valueName'');
是Js提供的内部数据结构,用来描述对象的属性,控制属性的行为
3 属性描述符对象
就是定义在Object原型对象Object.prototype上的方法,可以被Object实例直接使用
2.Object的实例方法