文章目录
1、静态方法
定义
静态方法就是直接使用类名调用的方法,比如Object.getOwnPropertyNames(obj),obj是一个对象,且静态方法是无法被子类继承或者实例对象拥有的,
2、Object类的静态方法
①Object.getPrototypeOf()
Object.getPrototypeOf(obj) 获得obj的原型,也可以使用obj._ proto__属性获得obj的原型:
function fn() {
}
fn.prototype = [1, 2, 3]
var re = new fn()
var re1 = Object.getPrototypeOf(re)
console.log(re1);
结果:
②Object.defineProperty(obj,propName,desc)
该方法可以为obj新增一个名为propName的属性,同时它的属性定义为desc,desc使用一个对象赋值,例如:
var obj = {}
Object.defineProperty(obj, "a", {
value: "lalala",
wirtable: true, //是否可写
enumerable: true, //是否可枚举
configurable: false, //是否可删除
// set() {},
// get() {} //value 和get与set只能选一个
});
console.log(obj.a, 111);
// wirtable
obj.a = 100 //不可写 但是不会报错
console.log(obj.a, 222);
//enumerable
for (let key in obj) {
console.log(key, obj[key], 333);
}
//onfigurable
delete obj.a
console.log(obj.a, 444);
结果:
③Object.create(proto,[props])
以proto为原型,新建一个实例对象,同时将props定义的属性设置给这个新对象,以这种方式新建的对象都是Object类型,例如:
var obj = {
name: "karen"
}
var f1 = Object.create(obj, {
life: {
value: 7
}
})
console.log(f1, f1.name);
结果:
④Object.getOwnPropertyDescriptor(obj,propName)
返回obj的属性propName的属性描述符:
var obj = {
name: "karen"
}
var f1 = Object.create(obj, {
life: {
value: "lalala",
wirtable: true, //是否可写
enumerable: true, //是否可枚举
configurable: true, //是否可删除
}
})
console.log(f1);
var re = Object.getOwnPropertyDescriptor(f1, "life")
console.log(re);
结果:
⑤Object.preventExtensions()
将实例对象o设置为不可扩展,那么即时给它一个新属性name没有报错,但这个name属性并没有添加到它的定义中。同时size属性的configurable如果设置为true的话,可以使用delete o.size 删除size属性。注意没有preventExtensible的反相操作。
var obj = {
hqyj: 100
}
var re = Object.preventExtensions(obj)
console.log(re, re === obj)
obj.age = 200
console.log(obj, obj.age)
结果:
⑥ Object.seal()
可以禁止obj对象的属性扩展和删除,它相对与preventExtensible方法而言 ,将所有属性的configurable属性设置为false。
var obj = {
hqyj: 100
}
var re = Object.seal(obj)
delete obj.hqyj
console.log(obj)
结果:
⑦Object.freeze()
var obj = {
hqyj: 100
}
var re = Object.freeze(obj)
delete obj.hqyj
obj.hqyj = 300
console.log(obj.hqyj)//100
⑧Object.isExtensible(obj)、Object.isSealed(obj)、Object.isFrozen(obj)
var obj = {
hqyj: 100
}
var re = Object.isExtensible(obj) //Object.freeze(obj)
// delete obj.hqyj
obj.hqyj = 300
console.log(obj.hqyj, Object.isFrozen(obj), Object.isSealed(obj), Object.isExtensible(obj))