@(JavaScript基础)
JavaScript内置对象: Object
Object对象(或Object构造函数)
属性:
-----------------------------------------------------------------------------------
Object.length:
值为1
-----------------------------------------------------------------------------------
Object.propotype:
表示Object的原型对象
Object.propotype.__proto__ 表示Object的原型对象的原型对象,即null
Object.propotype.constructor 表示Object的原型对象的构造函数,即构造函数Object
Object.prototype属性的属性特性:
数据描述符和存取描述符均具有以下可选键值:
configurable:
当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,
可以使用delete删除属性,以及除writable特性外的其他特性可以被修改
默认为 false
enumerable:
当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。
默认为 false
数据描述符同时具有以下可选键值:
value:
该属性对应的值。默认为 undefined。
writable:
当且仅当该属性的writable为true时,该属性才能被赋值运算符改变
默认为 false
存取描述符同时具有以下可选键值:
get:
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。
该方法返回值被用作属性值。默认为 undefined。
注意:该方法无参数
set:
一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。
该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined
-----------------------------------------------------------------------------------
方法:
-----------------------------------------------------------------------------------
Object.create(proto[, propertiesObject]):
描述:
使用指定的原型对象和属性创建一个新对象
参数:
proto:
新创建对象的原型对象
propertiesObject:
如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性
这些属性对应Object.defineProperties()的第二个参数
返回值:
在指定原型对象上添加新属性后的对象
例子:
const obj={name:'lee'};
const newObj=Object.create(obj);
console.log(obj); // {name:'lee'}
console.log(obj.name); // "lee"
const newObject=Object.create(obj,{
age:{
value:18
},
hobby:{
value:'read'
}
});
console.log(newObject); // {age: 18, hobby: "read"}
-----------------------------------------------------------------------------------
Object.defineProperty(obj, prop, descriptor)
描述:
给对象添加一个属性并指定该属性的配置
参数:
obj
prop
descriptor:
描述符对象
返回值:
被传递给函数的对象
例子:
const o={
name:'lee',
_age:12
};
// 等价于
Object.defineProperty(o,'name',{
value:'lee',
writable : true,
configurable : true,
enumerable : true
}); {name:"lee"}
Object.defineProperty(o,'age',{
get:function(){
return this._age;
},
set:function(value){
console.log(value,'set')
return value*2;
},
enumerable:true,
configurable:true
});
console.log(o.age); // 12
o.age=18; // 18 set
console.log(o.age); // 12
// 注意:存取描述符的值只能通过set函数来设置
-----------------------------------------------------------------------------------
Object.defineProperties(obj, props):
描述:
给对象添加多个属性并分别指定它们的配置
参数:
obj
props
返回值:
被传递给函数的对象
例子:
const obj={};
Object.defineProperties(obj,{
name:{
value:"lee",
writable : true,
configurable : true,
enumerable : true
},
age:{
value:18,
writable : true,
configurable : true,
enumerable : true
}
}); // {name: "lee", age: 18}
-----------------------------------------------------------------------------------
Object.is(value1, value2):
描述:
比较两个值是否相同。所有 NaN 值都相等(这与==和===不同)
如果下列任何一项成立,则两个值相同:
两个值都是 undefined
两个值都是 null
两个值都是 true 或者都是 false
两个值是由相同个数的字符按照相同的顺序组成的字符串
两个值指向同一个对象
两个值都是数字并且
都是正零 +0
都是负零 -0
都是 NaN
都是除零和 NaN 外的其它同一个数字
参数:
value1
value2
返回值:
boolean值
例子:
Object.is('foo', 'foo'); // true
Object.is(window, window); // true
Object.is('foo', 'bar'); // false
Object.is([], []); // false
// 特例
Object.is(0, -0); // false
Object.is(-0, -0); // true
Object.is(NaN, 0/0); // true
-----------------------------------------------------------------------------------
Object.assgin( target,...sources ):
描述:
用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,
参数:
target:
目标对象
sources:
源对象
返回值:
返回目标对象
例子:
const obj={},
source={a:1},
arr=[2,3];
Object.assign(obj,source,arr); // {0: 2, 1: 3, a: 1}
总结:
该方法常用来将一个多个对象的键值对复制到空对象中去
-----------------------------------------------------------------------------------
Object.preventExtensions(obj):
描述:
防止对象的任何扩展
参数:
obj:
将要变得不可扩展的对象
返回值:
已经不可扩展的对象
例子:
const obj={};
const newObj=Object.create(obj);
newObj.name='lee';
newObj.age=18;
Object.preventExtensions(newObj);
Object.getOwnPropertyDescriptors(newObj);
// {
// age:{
// value: 18,
// writable: true,
// enumerable: true,
// configurable: true // 调用preventExtensions方法后的对象属性仍然可以配置
// },
// name:{
// value: "lee",
// writable: true,
// enumerable: true,
// configurable: true
// }
// }
newObj.hobby='read';
console.log(newObj); // {name: "lee", age: 18}
delete newObj.name;
console.log(newObj); // {age: 18}
obj.name='panda';
console.log(newObj.name); // 'lee'
-----------------------------------------------------------------------------------
Object.seal(obj):
描述:
可以让一个对象密封,并返回被密封后的对象。
密封对象将会阻止向对象添加新的属性,并且会将所有已有属性的可配置性(configurable)置为不可配置(false),即不可修改属性的描述或删除属性。
但是可写性描述(writable)为可写(true)的属性的值仍然可以被修改
参数:
obj
返回值:
将要被密封的对象
例子:
const obj={};
const newObj=Object.create(obj);
newObj.name='lee';
newObj.age=18;
Object.seal(newObj);
Object.getOwnPropertyDescriptors(newObj);
// {
// age:{
// value: 18,
// writable: true,
// enumerable: true,
// configurable: false // 调用seal方法后的对象属性仍然不可配置
// },
// name:{
// value: "lee",
// writable: true,
// enumerable: true,
// configurable: false
// }
// }
newObj.hobby='read';
console.log(newObj); // {name: "lee", age: 18}
delete newObj.name;
console.log(newObj); // {name: "lee", age: 18}
newObj.name='panda';
console.log(newObj.name); // 'panda'
-----------------------------------------------------------------------------------
Object.freeze(obj):
描述:
冻结对象:其他代码不能删除或更改任何属性,
如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象
参数:
obj
返回值:
被冻结的对象
例子:
const obj={};
const newObj=Object.create(obj);
newObj.name='lee';
newObj.age=18;
Object.freeze(newObj);
Object.getOwnPropertyDescriptors(newObj);
// {
// age:{
// value: 18,
// writable: false, // 调用freeze方法后的对象属性不可更改
// enumerable: true,
// configurable: true // 调用freeze方法后的对象属性不可配置
// },
// name:{
// value: "lee",
// writable: false,
// enumerable: true,
// configurable: true
// }
// }
newObj.hobby='read';
console.log(newObj); // {name: "lee", age: 18}
delete newObj.name;
newObj.name='panda';
console.log(newObj); // {name: "lee", age: 18}
newObj.name='panda';
console.log(newObj.name); // 'lee'
// 深冻结
function deepFreeze(obj){
var propNames = Object.getOwnPropertyNames(obj);
propNames.forEach(function(name) {
var prop = obj[name];
if (typeof prop == 'object' && prop !== null)
deepFreeze(prop);
});
return Object.freeze(obj);
};
const o={person:{name:'lee'}};
deepFreeze(o);o.person.name='zz';
console.log(o.person.name); // 'lee'
-----------------------------------------------------------------------------------
Object.isExtensible(obj):
描述:
判断对象是否可扩展,是否可以在它上面添加新的属性
默认情况下,对象是可扩展的:即可以为他们添加新的属性。
以及它们的 __proto__ 属性可以被更改。
Object.preventExtensions,Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展
参数:
obj
返回值:
boolean值
例子:
const obj={};
Object.isExtensible(obj); // true
// ...可以变的不可扩展.
Object.preventExtensions(obj);
Object.isExtensible(obj); // false
// 密封对象是不可扩展的.
Object.seal(obj);
Object.isExtensible(obj); // false
// 冻结对象也是不可扩展.
Object.freeze(obj);
Object.isExtensible(obj); // false
-----------------------------------------------------------------------------------
Object.isSealed(obj):
描述:
如果这个对象是密封的,则返回 true,否则返回 false
密封对象是指那些不可 扩展 的,且所有自身属性都不可配置且因此不可删除(但不一定是不可写)的对象
参数:
obj
返回值:
boolean
例子:
const obj={name:'lee'};
Object.preventExtensions(obj);
obj.age=18;
console.log(obj)
-----------------------------------------------------------------------------------
Object.isFrozen(obj):
描述:
判断对象是否已经冻结
一个对象是冻结的是指它不可扩展,所有属性都是不可配置的,
且所有数据属性(即没有getter或setter组件的访问器的属性)都是不可写的
参数:
obj
返回值:
boolean
例子:
const obj={};
Object.isSealed(obj); // false
// ...可以变的不可扩展.
Object.preventExtensions(obj);
Object.isSealed(obj); // true
// 密封对象是不可扩展的.
Object.seal(obj);
Object.isSealed(obj); // true
// 冻结对象也是不可扩展.
Object.freeze(obj);
Object.isSealed(obj); // true
-----------------------------------------------------------------------------------
获取对象属性描述符对象
Object.getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor(obj, prop):
描述:
返回对象指定的属性配置
参数:
obj
prop
返回值:
如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),
否则返回 undefined
例子:
-----------------------------------------------------------------------------------
Object.getOwnPropertyDescriptors
Object.getOwnPropertyDescriptors(obj):
描述:
返回对象指定的属性配置
参数:
obj
返回值:
所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象
例子:
const obj={};
const newObj=Object.create(obj);
newObj.name='lee';
newObj.age=18;
Object.getOwnPropertyDescriptors(newObj);
// {
// age:{
// value: 18,
// writable: true,
// enumerable: true,
// configurable: true
// },
// name:{
// value: "lee",
// writable: true,
// enumerable: true,
// configurable: true
// }
// }
冻结或密封或阻止对象扩展详解:
总结:
不可扩展:
阻止添加自身的属性,但属性仍然可以添加到对象原型
不可扩展对象的属性仍然可被删除
密封对象:
是指那些不可 扩展 的,且所有自身属性都不可配置且因此不可删除(但不一定是不可写,可写性描述(writable)为可写(true)的属性的值仍然可以被修改)的对象
冻结对象:
冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可配置性、可写性。(可枚举性是可以修改的,官网有误)
也就是说,这个对象永远是不可变的
枚举方法:
从 ECMAScript 5 开始,有三种原生的方法用于列出或枚举对象的属性:
for...in 循环
该方法依次访问一个对象及其原型链中所有可枚举的属性。(原型链+可枚举)
Object.keys(o)
该方法返回一个对象 o 自身包含(不包括原型中)的所有属性的名称的数组。(可枚举)
Object.getOwnPropertyNames(o)
该方法返回一个数组,它包含了对象 o 所有拥有的属性(无论是否可枚举)的名称。(所有属性,不论是否枚举)
Object.getOwnPropertySymbols(obj):
该方法返回一个数组,它包含了指定对象自身所有的符号属性。(符号属性)
Object.entries(obj):
该方法返回给定对象自身可枚举属性的[key, value]数组
例子:
const o={
sex:'boy',
weight:'60kg'
};
let age=Symbol('age');
const newObj=Object.create(o)
Object.defineProperties(newObj,{
'name':{
value:'lee',
writable:true,
enumerable:true,
configurable:true,
},
'hobby':{
value:'read',
writable:true,
enumerable:true,
configurable:true,
},
[age]:{
value:18,
writable:true,
enumerable:false,
configurable:true,
},
'friend':{
value:'Jack',
writable:true,
enumerable:false,
configurable:true,
},
});
const arr=[];
for(let v in newObj){
arr.push(v)
};
console.log(arr); // ["name", "hobby", "sex", "weight"]
const arr2=Object.keys(newObj);
console.log(arr2); // ["name", "hobby"]
const arr3=Object.getOwnPropertyNames(newObj);
console.log(arr3); // ["name", "hobby", "friend"]
const arr4=Object.getOwnPropertySymbols(newObj);
console.log(arr4); // [Symbol(age)]
const arr5=Object.entries(newObj);
console.log(arr5); // [["name", "lee"],["hobby", "read"]]
-----------------------------------------------------------------------------------
Object.keys(obj):
描述:
返回一个由一个给定对象的自身可枚举属性组成的数组,
数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致
(两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)
参数:
obj
返回值:
一个表示给定对象的所有可枚举属性的字符串数组
例子:
const obj={name:'lee'};
const newObj=Object.create(obj);
newObj.age=18;
console.log(Object.keys(newObj)); // ['name']
const arr=[];
for(let v in newObj){
arr.push(v);
}
console.log(arr); // ['name','age']
-----------------------------------------------------------------------------------
Object.getOwnPropertyNames(obj):
描述:
返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名
参数:
obj
返回值:
在给定对象上找到的属性对应的字符串数组
例子:
const arr=['a','b','c','d'];
Object.getOwnPropertyNames(arr); // ["0", "1", "2", "3", "length"]
const arr={0:'a',1:'b',2:'c'};
console.log(Object.getOwnPropertyNames(arr)); // ["0", "1", "2"]
const obj={name:'lee',age:18};
console.log(Object.getOwnPropertyNames(obj)); // ["name", "age"]
-----------------------------------------------------------------------------------
Object.getOwnPropertySymbols(obj):
描述:
返回一个数组,它包含了指定对象自身所有的符号属性
参数:
obj
返回值:
在给定对象自身上找到的所有 Symbol 属性的数组
例子:
const obj={};
let a=Symbol('a');
let b=Symbol('b');
obj[a]='name';
obj[b]='age';
obj.hobby='read';
Object.getOwnPropertySymbols(obj); // [Symbol(a), Symbol(b)]
-----------------------------------------------------------------------------------
Object.values(obj):
描述:
返回给定对象自身可枚举值的数组
参数:
obj
返回值:
Object.values()返回一个数组,其元素是在对象上找到的枚举属性值
例子:
const obj={name:'lee',age:18};
Object.values(obj); // ["lee", 18]
-----------------------------------------------------------------------------------
Object.entries(obj):
描述:
返回给定对象自身可枚举属性的[key, value]数组
参数:
obj
返回值:
给定对象自身可枚举属性的键值对数组
例子:
const obj={name:"lee",age:18};
Object.entries(obj)); //[['name','lee'],['age',18]]
获取或设置对象的原型对象
-----------------------------------------------------------------------------------
Object.getPrototypeOf(obj):
描述:
返回指定对象的原型对象
参数:
obj
返回值:
给定对象的原型。如果没有继承属性,则返回 null
例子:
const proto=null;
const obj=Object.create(proto); // {}
Object.getPrototypeOf(obj)==null; // true
-----------------------------------------------------------------------------------
Object.setPrototypeOf(obj, prototype):
描述:
设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null
参数:
obj:
要设置其原型的对象
prototype:
该对象的新原型(一个对象 或 null)
返回值:
要设置其原型的对象
例子:
const obj={};
const proto={name:'lee',age:18};
Object.setPrototypeOf(obj,proto);
console.log(obj.__proto__); // {name: "lee", age: 18}
-----------------------------------------------------------------------------------
Object.prototype
属性:
-----------------------------------------------------------------------------------
Object.prototype.constructor
特定的函数,用于创建一个对象的原型
-----------------------------------------------------------------------------------
Object.prototype.__proto__
指向当对象被实例化的时候,用作原型的对象
-----------------------------------------------------------------------------------
方法:
-----------------------------------------------------------------------------------
Object.prototype.hasOwnProperty(prop):
描述:
返回一个布尔值 ,表示某个对象是否含有指定的属性,而且此属性非原型链继承的。
参数:
prop
返回值:
boolean值
-----------------------------------------------------------------------------------
Object.prototype.isPrototypeOf(obj)
描述:
返回一个布尔值,表示指定的对象是否在本对象的原型链中
参数:
obj
返回值:
boolean值
-----------------------------------------------------------------------------------
Object.prototype.propertyIsEnumerable()
判断指定属性是否可枚举,内部属性设置参见 ECMAScript [[Enumerable]] attribute 。
Object.prototype.toLocaleString()
直接调用 toString()方法。
Object.prototype.toString()
返回对象的字符串表示。
Object.prototype.valueOf()
-----------------------------------------------------------------------------------