写在博客之前的话,这是我这个刚毕业的菜鸟的第一篇博客。一口吃不成一个胖子,我也希望写的第一篇东西就让读的人醍醐灌顶。我会抱着怀疑的态度来看自己写的文章,如果有写错的地方,请大家不要被误导,如果有大神提出意见,我会验证之后进行修改。
js中对象
对象是某个特定的引用类型的实例。创建的对象的方法有两种,使用new操作符后跟Object的构造函数,还有一种是使用对象字面量。
1,这是通过new操作符然后直接给属性赋值的方法创建对象
var person=new object();
person.name="shaoqi";
perosn.age=18;
person.job='IT' person.sayName=function(){
alert(this.name)
}
2,对象字面创建对象
var person={
name:"shaoqi",
age:18,
job:"IT", sayName:function(){
alert(this.name);
}
}
js中对象的属性
js中的属性分两种,数据属性和访问器属性。两者就像c#中的字段和属性(这是我认为的)。属性在创建的是都带有一些特征值,javaScript通控制特征来定义它们的行为。
1,数据属性。
属性属性有以下几个特性:
[[Configuarable]]:表示能否通过delte删除该属性,或者将属性修改文访问器属性
[[Enumerable]]:是否可以通过for-in循环返回属性。
[[Writeable]]:是否能修改属性的值,默认为true。
[[Value]]:属性的值,默认为undefined。
我们可以用Object.defineProperty()这个方法修改属性的特性。可以用下面的代码实现上面的特性。
Configurable:
var person={
} Object.defineProperty(person,"name",{
configurable:false,
value:"shaoqi"
}) alert(person.name);
delete person.name;
alert(person.name);你会发现name的值并没有被删除,也就是说Configurable设置为false是不能将该属性删除的。需要注意的是在非严格模式下这种做法是不会引发错误的,但在严格模式下是会发生错误的。
Writeable:
var person={
} Object.defineProperty(person,"name",{
writable:false,
value:"shaoqi"
}) alert(person.name);
person.name="ddddd"
alert(person.name);name的值也是不会变的。
Enumerable:
var person={
} Object.defineProperty(person,"name",{
writable:false,
enumerable:false,
value:"shaoqi"
})
var keys=Object.keys(person);
console.log(keys);可以修改Enumerable的值来看最后log打出印出来的结果。
2,访问器属性
访问器属性也有几个特性
[[Configurable]]:表示能否通过delte删除该属性,或者将属性修改文访问器属性
[[Enumerable]]:是否可以通过for-in循环返回属性。
[[Get]]:在读取属性时调用的函数。默认为undefined
[[Set]]:在写入属性时调用的函数。默认为undefined
Configurable和Enumerable和数据属性相同。下面重点介绍Get和Set的属性。
访问器属性不能直接定义的,也必须使用Object.defineProperty()来定义。
var book={
_year:2004,
edition:1
} Object.defineProperty(book,"year",{
get:function()
{
return this._year;
},
set:function(newValue){
if(newValue>2004)
{
this._year=newValue;
this.edition+=newValue-2004;
}
}
}) book.year=2006;
console.log(book.edition);
结果应该是三,在赋值的时候,调用了我们写的set函数。这个C#中的字段和属性的关系十分的相似。
3,如何获取属性的特性
在ECMAScript5中的Object.getOwnPropertyDescriptor()的方法,可以取得给定属性的描述符。可以通过他给出的属性来判断是数据属性还是访问器属性。
var book={
_year:2004,
edition:1
} Object.defineProperty(book,"year",{ get:function()
{
return this._year;
},
set:function(newValue){
if(newValue>2004)
{
this._year=newValue;
this.edition+=newValue-2004;
}
}
}) book.year=2006;
console.log(book.edition); var descript=Object.getOwnPropertyDescriptor(book,"year");
console.log(descript.value);
console.log(descript.configurable);
console.log(descript.enumerable);
console.log(descript.get);
对于访问器的value是为undefined的,其他应该没有什么问题。get的方法也都打在日记里面了。
js的属性就先讲到这里,虽然对应用方面不太重要。但对js的对象理解还是比较起作用的。下一篇准备开始写创建对象的模式,继承的模式,原型链的解释。希望自己能形成自己的知识体系。