Object.prototype.value:设置属性的值
Object.prototype.writable:是否可修改属性的值;默认为false
Object.prototype.enumerable:是否可枚举属性;默认为false
Object.prototype.configurable:是否可修改属性的特性;默认为false数组
使用指定的原型对象及其属性去建立一个新的对象。函数
var parent = { x : 1, y : 1 } var child = Object.create(parent,{ z : { // z会成为建立对象的属性 writable:true, configurable:true, value: "newAdd" } }); console.log(child); //{z: "newAdd"} console.log(hild.__proto__); //{x: 1, y: 1}
在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。prototype
obj:必需。目标对象 prop:必需。需定义或修改的属性的名字 descriptor:必需。将被定义或修改的属性的描述符 返回值: 传入函数的对象。即第一个参数obj
var obj = { test:"hello" } Object.defineProperty(obj,"haha",{ configurable: true, enumerable: true, value: "kkk", writable: true }); // { haha: "kkk" test: "hello" }
对象里目前存在的属性描述符有两种主要形式:code
描述符必须是两种形式之一;不能同时是二者。
数据描述符和存取描述符均具备如下可选键值:对象
configurable true,该属性描述符才可以被改变,同时该属性也能从对应的对象上被删除。默认为 false。 enumerable true,该属性才可以出如今对象的枚举属性中。默认为 false。
数据描述符同时具备如下可选键值:继承
value 该属性对应的值。能够是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。 writable true,该属性才能被赋值运算符改变。默认为 false。
存取描述符同时具备如下可选键值:ip
get 一个给属性提供 getter 的方法,若是没有 getter 则为 undefined。该方法返回值被用做属性值。默认为 undefined。 set 一个给属性提供 setter 的方法,若是没有 setter 则为 undefined。该方法将接受惟一参数,并将该参数的新值分配给该属性。默认为 undefined。
// get & set var obj = {}; var initValue = 'hello'; Object.defineProperty(obj,"newKey",{ get:function (){ return initValue; }, set:function (value){ initValue = value; } }); obj.newKey //"hello" obj.newKey = "haha"; //"haha" obj.newKey //"haha" // set var obj1 = {}; var initValue1 = 'hello'; Object.defineProperty(obj1,"newKey",{ set:function (value){ initValue1 = value; } }); obj1.newKey //undefined obj1.newKey = "haha"; //"haha" obj1.newKey //undefined // get var obj2 = {}; var initValue2 = 'hello'; Object.defineProperty(obj2,"newKey",{ get:function (){ return initValue2; }, }); obj2.newKey //"hello" obj2.newKey = "haha"; //"haha" obj2.newKey //"hello"
直接在一个对象上定义新的属性或修改现有属性,并返回该对象。原型链
var obj = {}; Object.defineProperties(obj, { 'property1': { value: true, writable: true }, 'property2': { value: 'Hello', writable: false } }); console.log(obj) // {property1: true, property2: "Hello"}
返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不须要从原型链上进行查找的属性)。字符串
若是指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),不然返回 undefined。get
获取一个对象的全部自身属性的描述符。
var obj = { name : 'js', age : 20 } console.log(Object.getOwnPropertyDescriptors(obj)); // {name: {…}, age: {…}} // age: {value: 20, writable: true, enumerable: true, configurable: true} // name: {value: "js", writable: true, enumerable: true, configurable:true}
返回一个由指定对象的全部自身属性的属性名(包括不可枚举属性但不包括Symbol值做为名称的属性)组成的数组。
var obj = { 0: "a", 1: "b", 2: "c"}; Object.getOwnPropertyNames(obj); //["0", "1", "2"]
返回一个给定对象自身的全部 Symbol 属性的数组。
对象不能再添加新的属性。可修改,删除现有属性,不能添加新属性。
var obj = { name :'lilei', age : 30 , sex : 'male' } obj = Object.preventExtensions(obj); //{name: "lilei", age: 30, sex: "male"} obj.name = "hanmeimei"; //{name: "hanmeimei", age: 30, sex: "male"} obj.cc = "ee"; //{name: "hanmeimei", age: 30, sex: "male"}
返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (二者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)。
var obj = { foo: "bar", baz: 42 }, keys = Object.keys(obj); console.log(keys); //["foo", "baz"]
方法返回一个给定对象本身的全部可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。
Object.values会过滤属性名为 Symbol 值的属性。
var an_obj = { 100: 'a', 2: 'b', 7: 'c' }; console.log(Object.values(an_obj)); //["b", "c", "a"]
返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。
var obj = { foo: 'bar', baz: 42 }; console.log(Object.entries(obj)); //[Array(2), Array(2)] // [["foo", "bar"], ["baz", 42]]
该方法主要用于对象的合并,将源对象source的全部可枚举属性合并到目标对象target上,此方法只拷贝源对象的自身属性,不拷贝继承的属性。
const target = { x : 0, y : 1 }; const source = { x : 1, z : 2 , fn : { number : 1 } }; Object.assign(target, source); // target {x : 1, y : 1, z : 2, fn : {number : 1}} 同名属性会被覆盖 // source {x : 1, z : 2, fn : {number : 1}}
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,若是源对象某个属性的值是对象,那么目标对象拷贝获得的是这个对象的引用。同名属性会替换。
返回指定对象的原型(内部[[Prototype]]属性的值,即__proto__,而非对象的prototype)。
判断一个对象是否存在于另外一个对象的原型链上。
设置对象的原型对象
判断两个值是否相同。
若是下列任何一项成立,则两个值相同:
Object.is([], []); // false
冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象。
var obj = { prop: function() {}, foo: 'bar' }; Object.freeze(obj); //{prop: ƒ, foo: "bar"} obj.foo = 'eee'; console.log(obj); //{prop: ƒ, foo: "bar"}
判断一个对象是否被冻结。
判断对象是不是可扩展的,Object.preventExtensions,Object.seal 或 Object.freeze 方法均可以标记一个对象为不可扩展(non-extensible)。
Object.seal() 方法可让一个对象密封,并返回被密封后的对象。密封一个对象会让这个对象变的不能添加新属性,且全部已有属性会变的不可配置。属性不可配置的效果就是属性变的不可删除,以及一个数据属性不能被从新定义成为访问器属性,或者反之。但属性的值仍然能够修改。尝试删除一个密封对象的属性或者将某个密封对象的属性从数据属性转换成访问器属性,结果会静默失败或抛出TypeError 异常. 不会影响从原型链上继承的属性。但 proto ( ) 属性的值也会不能修改。
判断一个对象是否被密封。
判断对象是否拥有一个指定名称的实例属性(非继承)
参数:
①propertyName {string} :属性名称。
返回值:
{bool} 判断对象是否拥有一个指定名称的本地定义(非继承)的属性;此方法不会检查对象原型链中的属性。
true :属性为对象的实例属性,非继承。
false :属性不为对象的实例属性。
var o = new Object(); o.name = 'kkkk'; // 定义一个实例属性 console.log(o.hasOwnProperty('name')); // => true:name属性为实例o本身定义的,而非继承 console.log(o.hasOwnProperty('toString')); // => false:toString为继承属性
判断某个原型是否出如今对象的原型链中
语法:
prototype.isPrototypeOf(object)
参数:
①obejct {object} :被检测的对象。
返回值:
{bool} 返回某个原型是否出如今对象的原型链中
true :是
false :不是
var array = [1, 2, 3]; console.log(Array.prototype.isPrototypeOf(array)); // => true :数组原型 console.log(Object.prototype.isPrototypeOf(array)); // => true :Object是全部对象的基原型
判断指定名称的属性是否为实例属性而且是可枚举的(可用for/in循环枚举)
参数:
①propertyName {string} :属性名称
返回值:
{bool} 判断属性是否为实例属性而且是可枚举的(可用for/in循环枚举),不考虑原型链中的成员。
true :是
false :不是
var array = [1, 2, 3]; array.name = 'Array'; console.log(array.propertyIsEnumerable('name')); // => true :name属性为实例属性 console.log(array.propertyIsEnumerable('join')); // => false :join方法继承自Array console.log(array.propertyIsEnumerable('length')); // => false :length属性继承自Array console.log(array.propertyIsEnumerable('toString')); // => false :toString方法继承自Object