//不可枚举的属性,在控制台中其字体颜色就会变成浅
window.onload=function () {
/*******属性标签来控制对象属性的权限***********/
delete Object.prototype;//返回false,因为Object.prototype的属性标签设置其不能被删除
var descriptor=Object.getOwnPropertyDescriptor(Object,'prototype');//查询Object.prototype所有的属标签
console.log(descriptor)
//configurable:false 表示该属性不可配置
//enumerable:false 表示该属性不可被枚举
//
/*********delete删除变量*********/
var globalVal=5;
console.log(delete globalVal)//返回的是false,无法删除val申明的变量
function fn() {
}
delete fn ;//false
console.log(delete fn )//无法删除函数变量
//可以删除变量的特殊情况:
//①:隐式申明变量
globalVal0=6;
delete globalVal0
console.log(delete globalVal0)
//②:在eval中申明的变量可以被删除
eval("var s=10;console.log(delete s)")//返回true
//查看一个属性是否可以被枚举 propertyIsEnumerable(),传入属性的key值,字符串类型传参
var cat=new Object();
cat.leg=4;
cat.eye=2;
console.log('leg' in cat);//true in操作符会向对象的原型链上查找
console.log('eye' in cat);//true
console.log('toString' in cat);//true
console.log(cat.propertyIsEnumerable('leg'))//true
console.log(cat.propertyIsEnumerable('toString'))//false
//设置对象的属性标签
Object.defineProperty(cat,'price',{enumerable:false,value:1000});
//通过该方式创建对象的时,它的所有布尔类型的属性标签值都为false
console.log(cat.propertyIsEnumerable('price'))//false
console.log(cat)//在控制台中就看到cat的price属性变成灰色,就表示不可枚举
console.log(cat.hasOwnProperty('price'))//true
/****属性枚举*****/
var o={x:1,y:2,z:3}
console.log('toSring' in o);//true
o.propertyIsEnumerable('toString')//属性标签控制toString属性不可枚举
var key;
for(key in o){
console.log(key)//只会打印出 x y z,而不会打印出toString,因为toString属性不可枚举
}
//再在o对象的基础上创建对象obj
var obj=Object.create(o,{b:{value:8}});//返回一个新对象。在指定原型对象上添加新属性后的新对象
//通过Object.create()创建的对象,obj从o对象上继承
//Object.create(proto,{propertiesObject})
//****proto一个对象,应该是新创建的对象的原型
//propertiesObject可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符,
//只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。
//且属性b的属性标签默认都为false,不可写,不可枚举,不可配置的 configurable:false,enumerable:false
obj.a=6;
obj.b=10//下面打印obj,其中b的属性值依旧为8,没有变,b是不可写,不可枚举,不可配置的 无法用for in枚举出来
console.log(obj)//{a:6,b:8}
console.log(obj.__proto__)//指向的是o对象
var key0;
for(key0 in obj){
console.log(key0)// //b属性由于是不可枚举的,所以输出结果x y z a
if(obj.hasOwnProperty(key0)){//过滤掉原型上的属性
console.log(key0) //a
//b属性由于是不可枚举的,所以输出结果a
}
}
console.log(obj.hasOwnProperty('b'))//true obj对象本身就有b属性,只不过不可写,不可枚举,不可配置的
console.log(obj.b)//8
// hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,
// 此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员
}```
转载于:https://my.oschina.net/u/3407699/blog/1548812