03.JavaScript 面向对象精要–精通对象

JavaScript 面向对象精要–精通对象

就算JavaScript里有雅量内建引用类型,一点都不小概您要么会频繁的创导和谐的
对象。JavaScript中的对象是动态的。

壹.定义属性
当二个属性第三次被添加给对象时JavaScript在对上上调用了三个名称为
[[Put]]的里边方法,该方法会在对象上开创二个新节点保存属性,就像
哈希表上第三回添加四个键壹样那几个操作不仅内定了初叶值
也定义了品质的某个特点

1.1 [[Put]]里面方法
[[Put]]在对象上创设2个自有属性
1.2 [[Set]]在那之中方法
当两特性质被给予二个新值时,调用对象上的[[Set]]里面方法

var person1 = {
    name : 'Nicholas'//调用person1上的[[Put]]
}
var person2 = new Object();
person2.name = 'Nicholas'; //调用person2上的[[Put]]
person1.name = 'Greg'; //调用person1上的[[Set]]
perosn2.name = 'Greg' //调用person2上的[[Set]]

 

2.属性探测
出于特性能够在其他时候增进,所以有时候就有必不可缺
自小编批评对象上是或不是己有总体性
if判断中的值是三个 对象、非空字符串、非0数字和false时
判断为 真;当值为:null、underfined、0、false、NaN或
空字符串时为 假。

2.1 in 探测
in操作符会检查自有质量和原型属性。

var person = {
  name : 'Nicholas'
}
console.log('name' in person) //true;
console.log('age' in person) //false;
console.log('toString' in person) //true;
2.2 hasOwnProperty() 探测
obj.hasOwnProperty('name')只会探测自有属性。
console.log(person.hasOwnProperty('name')) //true;
console.log(person.hasOwnProperty('toString'));//false

 

三.刨除属性
delete操作符删除对象上质量时候,在目的上调用[[Delete]]
里面方法,你能够认为该操作在哈希表中移除3个键值对。
delete操作成功再次回到true。

var person = {
    name : 'Nicholas'
}
console.log('name' in person); //true;
delete person.name //调用[[Delete]] 返回true
console.log('name' in person); //false
console.log(person.name); //undefined

 

四.属性枚举
4.1 for-in 枚举
有着添加的习性暗中同意都以可枚举的,能够要for-in循环便利
它们,可枚举属性内部特征[[Enumerable]]都被安装为true
for-in会枚举1个对象的有着的可枚举的属性并将品质名赋
给3个变量

var property;
for(perperty in object){
console.log('Name'+property);
console.log('Value'+object[property]);
}

 

4.2 Object.keys() 方法
Object.keys(obj)能够获得可枚举属性的名字的 数组
只回去 自有 属性,不会遍历原型属性
var properties = Object.keys(obj);
var i,len
for(i = 0,len = properties.length;i<len;i++){
console.log(‘Name’+ properties[i]);//对象的键名
console.log(‘Value’ = obj[properties[i]]);//对象的值

}
4.3 propertyIsEnumerable() 方法
并不是具有目的都以可枚举的,实际上,对上绝大部分原生方法的
[[Enumerable]]特点 为 false,你能够动用 propertyIsEnumerable()
艺术检查二天性质是或不是可枚举。每种对象都怀有该办法。

var person = {
    name : 'Nicholas'
}
console.log('name' in person) //true
console.log(person.propertyIsEnumerable(name)) //true;
var properties = Object.keys(person);
console.log('length' in properties); //true;
console.log(properties.propertyIsEnumerable('length')) //false;

 

伍.属性类型
品质有两种档次:数据属性 和 访问器属性。
做客器属性不包蕴值而是定义二个当属性被读取时调用的函数
getter和一个当属性被写入时调用的函数 setter。
5.1 getter和setter

概念1个访问器属性name, _name保存了拜访器属性的实际值。
(_约定的命名规范)。

var person = {
    _name : 'Nicholas',
    get name() {
        console.log('name');
        return this._name;//返回属性值
    },
    set name(val){
        console.log('set name val');
        this._name = val;//设置属性值
    }
}
console.log(person.name); //返回'Nicholas'
person.name = 'Greg'; //如果只设置了getter 无法改变name的值
console.log(person.name); //返回'Greg'

 

您并不一定同时定义setter和getter,要是只定义了getter
该属性就改成了 只读

陆.属性特征
ECMAScript5引进了八种方法来和质量特征之间交互

六.一 通用特征 [[Enumerable]] [[Configurable]]
[[Enumerable]] 决定了是还是不是能够遍历该属性;
[[Configurable]] 决定了该属性是不是可配置;
Object.defineProperty() 方法 能够用来改变属性的特色。
接受 三 个参数 :该属性的指标、该属性名、设置特色的指标。

var person = {
    name : 'Nicholas'
}
Object.defineProperty(person,'name',{
    enumerable : false,
    configurable : false
})

console.log('name' in person) //true;
console.log(person.propertyIsEnumerable('name')) //false;
var propers = Object.keys(person);
console.log(propers.length) // 0

delete person.name;    //无法删除
console.log(person.name) //'Nicholas'
Object.defineProperty(person,'name',{
    configurable : true //报错
})

 

六.2 数据属性特征
数据属性包蕴 访问器属性不负有的多个特点。
[[Value]]和 [[Writable]]
[[Value]] 保存属性的值;
[[Writable]] 属性是不是能够写入

var person = {
    name : 'Nicholas'
}
Object.defineProperty(person,'name',{
    value : 'Greg',
    enumerable : true,
    configurable : true,
    writable : true
})

 

当Object.defineProperty()被调用时,首先检查属性是或不是存在。
即便不设有,依据指标内定的性状创立值。
当你使用Object.defineProperty()创设属性时,一定要记得为
享有特征制定三个值,不然 布尔型 的性状会被默许设置为 false

6.三 访问器属性
走访器属性也有三个附加的特色,访问器属性不需求存储值
因而就从未有过[[Value]]和[[Writable]]。取而代之的是[[Get]]
和 [[Set]]和对象直面格局的 getter和setter1样。

var person = {
    _name : 'Nicholas',
    get name(){
        return this._name;
    },
    set name(val){
        this._name = val;
    }
}
//这段代码可以改写成:
    var person = {
        _name : 'Nicholas'
    }    
Object.defineProperty(person,'name',{
    get : function(){
        return this._name;
    },
    set : functiono(val){
        this._name = val;
    },
  enumerable : true,
  configurable : true
})            

 

陆.④ 定义多重属性
利用Object.defineProperties(obj,{})来为3个指标
概念三个属性的特性

var person = {};
Object.defineProperties(person,{
_name : {
value : 'Nicholas',
enumerable : true,
configurable : true,
writable : true
},
name : {
get : function(){
return this.name;
},
set : function(val){
this.name = val;
},
enumerable : true,
configurable : true

}
})

 

定义了_name数据属性和name访问器属性。

陆.5 获取属性的性状
利用Object.getOwnPropertyDescriptor()方法重回属性的特点
的一个指标就是未有被呈现的定义。
经受三个参数 属性所在的对象、属性名。

var person = {
  name = 'Nicholas'
}
var descriptor = Object.getOwnPropertyDescriptor(person,'name');
console.log(descriptor.enumerable); //true
console.log(descriptor.configurable); //true
console.log(descriptor.writable); //true
console.log(descriptor.value); //'Nicholas'

 

7.禁止修改对象
[[Extensible]]是叁个布尔值,它指明该目标特征是或不是可被改动。
你成立的享有指标暗中同意都以可被扩充的,意味着新的品质能够每一天
添加

七.1 禁止扩张
Object.preventExtensions()方法创造1个不行扩充的指标。
Object.isExtensible()来检查[[Extensible]]的值。

var person = {
    name : 'Nicholas'
}
console.log(Object.isExtensible(person)); //ture
Object.preventExtensions(person);
console.log(Object.isExtensible(person)); //flase
person.sayName = function(){
console.log(this.name);
};
console.log('sayName' in person); //false

 

7.二 对象封印
对象封印是创办3个不行扩张的对象的第1个措施。
三个封印的靶子是不足扩大且独具属性都不行配置
比方二个目的被封印,只能读写他的习性
选拔Object.seal() 方法封印对象
被调用时 [[Extensible]]和[[Configurable]]特征为 false.
可以用Object.isSealed()判断指标是还是不是被封印。

var person = {
    name : 'Nicholas'
}
console.log(Object.isExtensible(person)) // 是否扩展 true
console.log(Object.isSealed(person))    //是否被封印 false
Object.seal(person) //封印对象
console.log(Object.isExtensible(person)) // 是否扩展 false
console.log(Object.isSealed(person))    //是否被封印 true

 

7.3 对象冻结
始建不可增加的第四个章程便是冻结它。
如果一个对象被冷冻,则不能够在其上添加和删除属性
不能改变属性类型,也无法写入此外数据属性。
Object.freeze()来冻结三个目的
Object.isFrozen()判断三个目的是或不是被冷冻。

var person = {
    name : "Nicholas"
}
console.log(Object.isExtensiable(person)) //是否扩展 true
console.log(Object.isSealed(person)) //是否封印 false
console.log(Object.isFrozen(person)) //是否冻结 false
Object.freeze(person) //冻结对象
console.log(Object.isExtensiable(person)) //是否扩展 false
console.log(Object.isSealed(person)) //是否封印 true
console.log(Object.isFrozen(person)) //是否冻结 true