【js】Object上的一些方法
Object上的一些方法
- assign
- create
- defineProperties
- defineProperty
- keys
- values
- entries
- freeze
- isFrozen
- seal
- isSealed
- getPrototypeOf
- setPrototypeOf
- is
- isExtensible
- preventExtensions
- getOwnPropertyDescriptor
- getOwnPropertyDescriptors
- getOwnPropertySymbols
- getOwnPropertyNames
可枚举
属性的值从一个或对个对象分配
到目标对象,返回目标对象const target = { a: 1, b: 2 }
const source = { b: { b1: 3 }, c: 4 }
const result = Object.assign(target, source)
console.log(result, target);
target.b.b1 = 10
文章图片
- 可以看出assign是一种
浅拷贝
,没有开辟新的存储空间去存拷贝来的值,直接的引用
创建
一个空对象- 第一个参数作为该对象的
原型
- 第二个参数为该对象的默认属性
function School(name) { this.name = name } let obj = Object.create(School.prototype, { p: { value: 4, enumerable: false, writable: false, configurable: false }, length: { value: 0 } }) obj.q = 5 obj.p = 5 //writable为false,不可修改 delete obj.p //configurable为false,删除失败 for (let i in obj) { console.log(i); //enumerable为false,p不被枚举 } console.log(obj);
文章图片
- 默认的属性可以配置属性,枚举,可写,可配置
Object.defindeProperty
在一个对象上定义或修改
一个属性,返回该对象
- descriptor
- writable 可写
- enumerable 可枚举
- configurable 可删除
- value 值
- get 读值
- set 设置值
let o = { a: { name: "张三", age: 18, } } var val = null Object.defineProperty(o.a, "rank", { configurable: false, enumerable: true, get() { console.log("获取张三排名"); return val }, set(newval) { console.log("新值:" + newval); val = newval } }) o.a.rank = 1 console.log(o.a.rank); console.log(o);
文章图片
get set
和value writable
不能同时使用- 在添加rank值时set会监听到,可以赋值给一个
中间变量
或者该对象上的一个属性,get会在读
rank时执行 - 点击rank的
三个点
也会监听到读的操作
文章图片
- descriptor
Object.defineProperties(obj,props)
defineProperty有三个参数,但是只针对一个属性
defineProperties的第二个参数不是一个字符串,是一个对象
它将defineProperty的第三个参数融合到第二个参数里
可以去配置多个属性
let o = { a: { name: "张三", age: 18, } } var val = null let a = Object.defineProperties(o.a, { "rank": { value: 1, }, "grade": { get() { console.log("读:" + val); return val }, set(newval) { console.log("改" + newval); val = newval } } } ) o.a.grade = 9 console.log(o.a.rank, o.a.grade); console.log(a);
文章图片
- 属性的相关配置默认均为false
获取
指定对象自身属性的描述符
- 一个是获取
单个
,一个获取全部
const o = {} let val = 0 Object.defineProperties(o, { a: { value: 1, enumerable: true, configurable: false, }, b: { configurable: false, enumerable: false, get() { return val }, set(newval) { val = newval } } }) let d1 = Object.getOwnPropertyDescriptor(o, "a") let d2 = Object.getOwnPropertyDescriptors(o) console.log(d1, d2);
文章图片
普通的
追加
对象属性,也会返回相关描述
不过与defineProperty的默认值false正好相反
- keys:返回给定对象可枚举
属性值
组成的数组
- values:返回给定对象可枚举
属性名
组成的数组
- entries:返回给定对象可枚举
键值对
组成的数组
const o = { a: 1, b: 2, fn() { } } for (const k of Object.keys(o)) { console.log(k); //a b fn } for (const v of Object.values(o)) { console.log(v); //1 2 fu(){} } for (const e of Object.entries(o)) { console.log(e); //["a",1] ["b",2] ["fn",fn()] }
数组原型
上的keys()方法 返回的是Number
类型,Object上返回的是字符串
- freeze冻结一个对象,不可修改,不可加属性,不可删属性,其原型也不能修改
- seal封闭一个对象,可
修改已有属性
,不可加属性,不可删除属性,原型不可修改 - preventExtensions不可扩展, 可
删除
,可修改
,不可加属性,原型不可修改
const o1 = { a: 1, b: 2, fn() { } } Object.freeze(o1) console.log(Object.isFrozen(o1)); //true o1.a = 2 console.log(o1.a); // 1const o2 = { a: 1, b: 2, fn() { } } Object.seal(o2) console.log(Object.isSealed(o2)); //true o2.a = 2 console.log(o2.a); //2const o3 = { a: 1, b: 2, fn() { } } Object.preventExtensions(o3) console.log(Object.isExtensible(o3)); //false o3.a = 2 console.log(delete o3.b); //true console.log(o3.a); //2
freeze与seal都
不可扩展
且不可删除,isExtensible的值也为false
设置
对象的原型与获取
对象的原型
const obj = { name: "obj", getName() { console.log(this.name) } } let o = { name: "o" } Object.setPrototypeOf(o, obj) Object.getPrototypeOf(o).getName()//obj o.getName()//o
不建议
使用这种方式以及__proto__去修改原型
使用Object.create()
来创建一个指定原型的新对象
- 判断两个值是否为
同一个值
const o1 = {
a: 1
}
const o2 = { b: { c: 2 } }
const o3 = { b: { c: 2 } }
Object.assign(o1, o2)
console.log(Object.is(o1.b, o2.b));
//true
console.log(Object.is(o1.b, o3.b));
//false
9.Object.getOwnPropertyNames(obj)和Object.getOwnPropertySymbols(obj)引用的地址
不同会检测出是不同的值
对于原始类型,只要值相同即可
可以看出Object.assign()是浅拷贝
,对用引用类型并没有开辟新的内存空间去存储,只是复制了栈指针的指向
- getOWnPropertyNames返回指定对象的属性名组成的
数组
,包括不可枚举的属性,但不包括Symbol值的属性名 - getOwnPropertySymbols返回指定对象所有以Symbol为属性名的
数组
let f = Symbol("foo") const o = { [f]: 1, "a": 2, b: 3 } const n = Object.getOwnPropertyNames(o) const s = Object.getOwnPropertySymbols(o) console.log(n, s); //["a","b"] [Symbol(foo)]
2.isPrototypeOf
3.propertyIsEnumerable
4.toLocalString
5.toString
6.ValueOf
7.__defineGetter__(已废弃)
8.__defineSetter__(已废弃)
9.__lookupSetter__(已废弃)
10.__lookupSetter__(已废弃)
11.__proto__(属性 已废弃)
12.toSource()(非标准)
1.Object.prototype.hasOwnProperty(prop)
- 检测指定属性是否有某个属性,可以检测到
Symbol
类型
const a = [1] console.log(a.hasOwnProperty(0)); //true let s = Symbol("foo") const o = { [s]: "a", } console.log(o.hasOwnProperty(s)); //true
- 检测一个对象是否在另一个对象的
原型链
上
function School(name) { this.name = name } School.prototype = { constructor: School, getName() { console.log(this.name); } } function Student(name) { School.call(this, name) } Student.prototype = Object.create(School.prototype) Student.prototype.constructor = Student const std1 = new Student("张三") std1.getName() //张三 console.log(School.prototype.isPrototypeOf(std1)); //true
上面用
组合寄生
的方式实现的继承
可以检测出父类的原型
在子类实例
的原型链上
- 检测指定对象的某属性是否
可枚举
let s1 = Symbol("s1") let s2 = Symbol("s2") const o = { [s1]: 0, } Object.defineProperties(o, { [s2]: { value: 1, enumerable: true }, p: { value: 3, } }) console.log(o.propertyIsEnumerable(s1)); //true console.log(o.propertyIsEnumerable(s2)); //true console.log(o.propertyIsEnumerable("p")); //false
- toLocalString返回的是
本地环境
字符串,适合处理时间类型 - toString返回
唯一
字符串,不会因为环境的改变而变化 - valueOf返回对象的
原始值
function transform(o) {
console.log(Object.prototype.toLocaleString.call(o));
console.log(Object.prototype.toString.call(o));
console.log(Object.prototype.valueOf.call(o));
}
基本数据类型
transform(1000)
//"1000" "[object Number]" {1000}
transform(true)
//"true" "[object Boolean]" {true}
transform(Symbol("smb"))
//"Symbol('smb')" "[object Symbol]" {Symbol(smb)}
transform(1000n)
//"1000" "[object BigInt]" {1000n}
transform("str")
//"str" "[object String]" {"str"}
【【js】Object上的一些方法】引用数据类型
transform([0, 1])
//"0,1" "[object Array]" [0,1]
transform({ a: 0, b: 1 })
//"[object Object]" "[object Object]" {a:0,b:1}
transform(new Date())
//"标准时间" "[object Date]" "标准时间"
transform(function () { })
//"function () { }" "[object Function]" f () {}
transform(new Error("e"))
// "Error:e" "[object Error]" Error: e
- 可以看出toLocalString返回其内容的
字符串
- toString返回值唯一 都是方括号object + 数据类型的
字符串
- valueOf基本类型会返回一个
对象
引用类型返回其本身
推荐阅读
- 宽容谁
- 我要做大厨
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘