学习笔记

数值属性和访问器属性

2018-02-23  本文已影响0人  一个人夜里安静的发呆

'use strict'

//方法1:创建一个实例,再给它赋属性和方法

var person =new Object();

person.name="Jiaweiyuan";

person.age=23;

person.job="student";

person.sayName=function(){

console.log("name:"+this.name);

};

// 方法2:对象字面量

var person1={

name:"Zhouquan",

age:23,

job:"student",

sayName:function(){

console.log("name:"+this.name);

}

};

/*6.1.1 属性*/

/*1.数据属性:*/

//  [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性或者把属性修改成访问器属性。新定义的对象默认值是true

//  [[Enumerable]]:表示能否通过for-in循环返回属性,新定义的对象默认值为true

//  [[Writable]]:表示能否修改属性的值,新定义对象默认值为true

//  [[Value]]:包含这个属性的数据值,写入/读取数据值的时候,都从这个位置写入/读取

// ES5才出现的,描述了内部特征,不能直接访问,是为了实现javascript的引擎用的,放在两对儿方括号中、

var person2={

name:"Quanshushu"

};

//[[Value]]特性被设置为"Quanshushu",这个值若修改都会被反应在这个位置

/**/

//ES5的Object.defineProperty()方法用来修改属性的默认特性

//Object.defineProperty('属性所在的对象','属性的名字','描述符对象')

Object.defineProperty(person2,"name",{

writable:false,

enumerable:false

});

try{

person2.name="Zhoudeng";

//因为[[Writable]]特性值被修改成false,所以name属性没有被修改

//严格模式下,以上操作会报错

}catch(e){

// console.log(e.message);

}

/**/

// 关于[[Configurable]]特性有以下注意

try{

Object.defineProperty(person1,"name",{configurable:false});

delete person1.name;//result:"Cannot delete..."

}catch(e){

// console.log(e.message);

}

try{

Object.defineProperty(person1,"name",{configurable:false});

// Object.defineProperty(person1,"name",{configurable:true});//error,一旦把属性定义为不可配置的就不能重新定义为可配置的了

Object.defineProperty(person1,"name",{writable:true});//[[Configurable]]特性被设置为false之后,只有[[writable]]特性可以更改

person1.name="asd";

// console.log(person1.name);//result:"asd"

}catch(e){

console.log(e.message);

}

/**/

/*2.访问器属性:*/

//不包含数据值,包含一对儿getter和setter函数(但都不是必须的)

var salary={

_data:2350,//前面的下划线是一种记号,用于表示只能通过对象方法访问的属性

grade:"普通员工",

};

/*支持此方法的浏览器:IE9+,FF4+,SF5+,O12+,Chrome*/

Object.defineProperty(salary,"data",{

get:function(){

return this.data;

}

,

set:function(newValue){

if(newValue>=2350&&newValue<8950){

this._data=newValue;

this.grade="初级工程师";

}

else if(newValue>=8950&&newValue<18950){

this._data=newValue;

this.grade="中级工程师";

}

else if(newValue>=18950&&newValue<28950){

this._data=newValue;

this.grade="高级工程师";

}

else{

this._data=newValue;

this.grade="其他职位";

}

}

});

try{

salary.data=15400;

console.log(JSON.stringify(salary));

}catch(e){

// console.log(e.message)

}

//使用访问器属性的常见方式,即设置一个属性的值会导致其他属性发生变化

//只设置setter函数或者只设置getter函数在strict模式下会导致错误

//旧浏览器访问方法:

// 请注意,该方法是非标准的,不要尝试用它

var book={

_year:2004,

edition:1

}

book.__defineGetter__("year",function(){

return this._year;

});

book.__defineSetter__("year",function(newValue){

if(newValue>2004){

this._year=newValue;

this.edition+=newValue-2004;

}

});

book.year=2005;

// console.log(book.edition);

// 定义多个属性的Object.defineProperties()方法

上一篇下一篇

猜你喜欢

热点阅读