object方法整理

2019-05-27  本文已影响0人  希染丶

title: object方法
date: 2019-02-28 12:00:07
tags: js


1. Object.assign(target,source1,source2,...); 合并对象

将源对象的所有可枚举的属性合并到目标对象上。只拷贝源对象的自身属性,不拷贝继承的属性。

浅拷贝。如果拷贝的某个属性是对象,那么拷贝到的是这个对象的引用。

只进行值的复制,如果复制的值是个取值函数,那么求值后复制。

可以处理数组,但会把数组看做对象

同值属性被覆盖

const target = {
  x:0
}
const source = {
  x:1,
  y:0
}
Object.assign(target,source);
//target {x:1,y:0}  

2.Object.create(prototype,[propertiesObject]); 使用指定的原型对象及其属性去创建一个新的对象

var a ={
  x:0,
  y:0
};
var b = Object.create(a,{
  z:{
    writable:true, //是否可以采用 数据运算符 进行赋值
    configurable:true,  //是否可以修改、删除
    value: "newAdd" //值
  }
});
输出: b = {z:'newAdd'}

3.Object.defineProperties(obj,props); 直接在一个对象上定义新的属性或修改现有属性,并返回该对象 (批量)

var obj = {};
Object.defineProperties(obj, 
{  
   'property1': {    
       value: true,  
        writable: true 
   },  
  'property2': {   
     value: 'Hello',
     writable: false  
  }  // etc. etc.
});
console.log(obj) // {property1: true, property2: "Hello"}

4.Object.defineProperty(obj,prop,descriptor); 在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。(单个)

obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性

var Object = {};
Object.defineProperty(Object, 'is', 
{  
     value: 2,  
     configurable: true,  // 是否可以删除或者再次修改属性
     enumerable: false,  //是否可以被枚举
     writable: true   //  是否可以被重写
}); 
// Object = {is:2}
// 注意不能同时设置(writable,value) 和 get,set方法,否则浏览器会报错  
// 如果不设置属性特性。configurable、enumerable、writable 都默认为false
//Invalid property descriptor.  Cannot both specify accessors and a value or writable attribute

getter/setter
当设置或获取对象的某个属性的值的时候,可以提供getter/setter方法。

getter 是一种获得属性值的方法
setter是一种设置属性值的方法。

可在获取值和设置值的时候触发

var obj = {};
var initValue = 'hello';
Object.defineProperty(obj,"newKey",{
    get:function (){
        //当获取值的时候触发的函数
        return initValue;    
    },
    set:function (value){
        //当设置值的时候触发的函数,设置的新值通过参数value拿到
        initValue = value;
    }
});
//获取值
console.log( obj.newKey );  //hello

//设置值
obj.newKey = 'change value';

console.log( obj.newKey ); //change value

5.Object.keys(); 返回一个由一个给定对象的自身可枚举属性组成的数组,顺序与for...in获取的相同,但是for..i还会魅族其原型链的属性

let arr = ["a", "b", "c"];
console.log(Object.keys(arr));// ['0', '1', '2']/* Object 对象 */
let obj = { foo: "bar", baz: 42 }, keys = Object.keys(obj);
console.log(keys);// ["foo","baz"] 

6.Object.values(); 方法返回一个给定对象自己的所有可枚举属性值的数组,值的顺序与使用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']
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']

7.Object.entries(); 返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。

const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]
 
const simuArray = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(simuArray)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]

8.hasOwnProperty()

判断对象自身属性中是否具有指定的属性。

obj.hasOwnProperty('name')

9.Object.getOwnPropertyDescriptor(obj,prop);返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性).如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined。

var arr = ['name','age'] ;
arr.forEach(val => console.log(Object.getOwnPropertyDescriptor(obj,val)))
// {value: "js", writable: true, enumerable: true, configurable: true}
// undefined

10. Object.getOwnPropertyDescriptors(obj) 获取一个对象的所有自身属性的描述符。

var obj = {
    name : 'js',
    age : 20
}
console.log(Object.getOwnPropertyDescriptors(obj))

11. Object.getOwnPropertyNames(); 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。

var obj = { 0: "a", 1: "b", 2: "c"};

Object.defineProperty(obj,'z',{
    enumerable : false
})
console.log(Object.getOwnPropertyNames(obj))  // ["x", "y", "z"] 包含不可枚举属性 。
console.log(Object.keys(obj))                 // ["x", "y"]      只包含可枚举属性 。

12 Object.getOwnPropertySymbols();返回一个给定对象自身的所有 Symbol 属性的数组。

13 isPrototypeOf(); 判断一个对象是否存在一另一个对象的原型链上

14 Object.getOwnPropertySymbols(); 返回一个给定对象自身的所有 Symbol 属性的数组。

15 Object.is(); 判断两个对象是否相同

如果下列任何一项成立,则返回true
两个值都是 undefined
两个值都是 null
两个值都是 true 或者都是 false
两个值是由相同个数的字符按照相同的顺序组成的字符串
两个值指向同一个对象
两个值都是数字并且
都是正零 +0
都是负零 -0
都是 NaN
都是除零和 NaN 外的其它同一个数字

Object.is('foo', 'foo');     // true
Object.is(window, window);   // true
 
Object.is('foo', 'bar');     // false
Object.is([], []);           // false
 
var test = { a: 1 };
Object.is(test, test);       // true
 
Object.is(null, null);       // true
 
// 特例
Object.is(0, -0);            // false
Object.is(-0, -0);           // true
Object.is(NaN, 0/0);         // true

16 Object.freeze() 冻结一个对象。被冻结的对象 是永远不变的,返回被冻结的对象

17 Object.isFrozen() 判断一个对象是否被冻结 .

18 Object.preventExtensions() 对象不能再添加新的属性。可修改,删除现有属性

var obj = {
    name :'lilei',
    age : 30 ,
    sex : 'male'
}
 
obj = Object.preventExtensions(obj);
console.log(obj);    // {name: "lilei", age: 30, sex: "male"}
obj.name = 'haha';
console.log(obj)     // {name: "haha", age: 30, sex: "male"}
delete obj.sex ;
console.log(obj);    // {name: "haha", age: 30}
obj.address  = 'china';
console.log(obj)     // {name: "haha", age: 30}

19 Object.isExtensible() 判断对象是否是可扩展的,Object.preventExtensions,Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展(non-extensible)

20 Object.seal() 让一个对象密封,并返回被密封后的对象。密封一个对象会让这个对象变的不能添加新属性,且所有已有属性会变的不可配置。属性不可配置的效果就是属性变的不可删除,以及一个数据属性不能被重新定义成为访问器属性,或者反之。但属性的值仍然可以修改。尝试删除一个密封对象的属性或者将某个密封对象的属性从数据属性转换成访问器属性,结果会静默失败或抛出TypeError 异常. 不会影响从原型链上继承的属性。但 proto ( ) 属性的值也会不能修改。

var obj = {
    prop: function () {},
    foo: "bar"
  };
 
// 可以添加新的属性,已有属性的值可以修改,可以删除
obj.foo = "baz";
obj.lumpy = "woof";
delete obj.prop;
 
var o = Object.seal(obj);
 
assert(o === obj);
assert(Object.isSealed(obj) === true);
 
// 仍然可以修改密封对象上的属性的值.
obj.foo = "quux";
 
// 但你不能把一个数据属性重定义成访问器属性.
Object.defineProperty(obj, "foo", { get: function() { return "g"; } }); // 抛出TypeError异常
 
// 现在,任何属性值以外的修改操作都会失败.
obj.quaxxor = "the friendly duck"; // 静默失败,新属性没有成功添加
delete obj.foo; // 静默失败,属性没有删除成功
 
// ...在严格模式中,会抛出TypeError异常
function fail() {
  "use strict";
  delete obj.foo; // 抛出TypeError异常
  obj.sparky = "arf"; // 抛出TypeError异常
}
fail();
 
// 使用Object.defineProperty方法同样会抛出异常
Object.defineProperty(obj, "ohai", { value: 17 }); // 抛出TypeError异常
Object.defineProperty(obj, "foo", { value: "eit" }); // 成功将原有值改变

21.Object.isSealed() 判断一个对象是否密闭

Object状态:

1.冻结。永远不会变
2.密闭。
a:不可添加新属性
b:已有属性变的不可删除
c:数据的属性不能被重新定义为转换器属性
d:属性值仍然可以修改
e:尝试删除一个密封对象的属性或者将某个密封对象的属性从数据属性转换成访问器属性,结果会静默失败或抛出TypeError 异常. 不会影响从原型链上继承的属性
f:proto ( ) 属性的值也会不能修改
3.不可扩展:对象不能再添加新的属性。可修改,删除现有属性

上一篇下一篇

猜你喜欢

热点阅读