老铁们,此次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,可是能够本身建立啊,哈哈)。
JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分。因此分红三篇博客来逐个理清。
这是第一篇:理解对象,认识对象属性的类型。html
书中原话--ECMA-262中把对像定义为:无序属性的集合。其中属性能够是基本值,对象或者是函数。chrome
对象是一个真实存在的东西,就像世上每个人、每个物体同样,它有本身的属性,行为。也就是说各类属性集合在一块儿就是一个具体的对象。(你本身也是一个对象)编程
举一些生活例子:
小明:有名字,年龄(基本值),说话(方法) 等属性
电脑:有颜色,大小(基本值),cpu(对象)等属性函数
1.用new Object()构造函数方法来建立对象测试
//obj是我建立的一个对象,它有name、age属性,sayHi方法 var obj = new Object(); obj.name = "ry"; obj.age="3"; obj.sayHi = function(){ console.log("Hi"); }
2.用对象字面量建立对象this
//建立一个person对象 var person = { name : "ry", age : 3, sayBye: function(){ console.log('bye bye'); } };
上面说这么多,就想说明白js中的对象是什么。总之:无序的属性的集合 == 对象code
一开始咱们对未知的事物都会充满的疑惑和惊讶,可是知识这东西,咱们更多的选择去接受它,而后理解它,最后运用它。htm
对于对象属性类型这块,咱们只是简单的去了解有什么类型,类型区别。 这也有助于咱们去了解对象。对象
既然有不一样的类型,那确定要有一个东西去区分他们,那这个东西就是特性blog
名字 | 做用 |
---|---|
[[Configurable]] | 表示可否经过delete来删除属性,可否修改属性的特性,或可否把属性设为访问器属性,默认true。 |
[[Enumerable]] | 能不能经过for in枚举该属性,默认true。 |
[[Writable]] | 能不能修改属性值,默认true。 |
[[Value]] | 这个位置保存属性的值。好比下面的name属性,它的[[Value]]就保存"ry"这个字符串 |
//一个对象 var person = { //这就是一个数据属性 name:"ry"; }; console.log(person.name); //ry //透过代码能够看出,之前咱们定义对象属性就是数据属性,之前不知道它叫数据属性这个名字,但如今知道了。
//建立一个对象person var person = {}; //添加一个数据属性 person.name = "ry"; //使用Object.definProperty方法 Object.definProperty(person,"name",{ //writable表示能不能修改,false表示不能 writable:false, }) console.log(person.name); "ry" //修改name的值 person.name = "yuan"; //name的值不变,修改不了 console.log(person.name); "ry"
除此以外还能够修改其余特性,你们能够试试哦。
访问器属性的4个特性:
名字 | 做用 |
---|---|
[[Configurable]] | 表示可否经过delete来删除属性,可否修改属性的特性,或可否把属性设为访问器属性,默认true。 |
[[Enumerable]] | 能不能经过for in枚举该属性,默认true。 |
[[Get]] | 读取时调用的函数,默认undefined |
[[Set]] | 写入时调用的函数,默认undefined |
访问器属性特性不包含数据值,它们包含一对getter和setter函数(但这两个不是必须的)
访问器属性不能直接定义,只能经过Object.defineProperty()来定义。
▶ 书上的例子:
//一个对象 var book = { _year : 2004, edition : 1 }; //定义一个叫year的访问器属性 Object.defineProperty(book,"year",{ //设置get特性,这是一个方法 get: function(){ retrun this._year; }; //设置set特性 set:function(newValue){ if(newValue > 2004){ this._year = newValue; this.edition += newValue - 2004; } } }); //测试一下,给访问器属性赋值,即写入year,它会调用set的方法 book.year = 2005; //上面的2005大于2004,set方法中会改变edition的值,变成2 console.log(book.edtion); //2
▶ 特别提醒:Objecct.defineProperty() 的兼容性:IE9+,Firefox4+,chrome,Opera12+,Safari 5+
▶ 除此以外
还有一次定义多个属性的方法:Objecct.defineProperties() , 兼容性:IE9+,Firefox4+,chrome,Opera12+,Safari 5+。
读取属性特性方法:Object.getOwnPropertyDescriptor(),接受两参数:属性所在对象和要读取器描述符的属性名称。 返回一个对象。
//实践比较容易理解 //一个对象 var book = {}; //用Objecct.defineProperties()方法设置多个属性 Object.defineProperties(book,{ _year:{ value:"ry" }, edition:{ value:1 }, year:{ get:function(){ return this._year ; } } }); //函数返回一个对象 //descriptor对象有configurable,enumerable,writable,value属性/(若是是访问器属性:configurable,enumerable,get,set) //_year是数据属性 var descriptor = Object.getOwnPropertyDescriptor(book,"_year"); console.log(descriptor.value); //2004 console.log(descriptor.configurable); //true console.log(descriptor.enumerable); //true //数据属性没有get console.log(descriptor2.get); //undefined //year是访问器属性 var descriptor2 = Object.getOwnPropertyDescriptor(book,"year"); //访问器属性有get console.log(descriptor2.get); //function
此次介绍主要介绍:
1.什么是对象:无序属性的集合。
2.还有属性的类型:数据属性和访问器属性。还有两种属性的各个特性,区别。不用深刻,起码知道有这些东西。
3.属性的类型有个了解就好,主要用的仍是数据属性(平时用的)。
不忘初心,方得始终。以为写得很好就赞一下吧,也能够关注博主哦
同系列前几篇:
第一篇:JavaScript--我发现,原来你是这样的JS(一)(初识)
第二篇:JavaScript--我发现,原来你是这样的JS(二)(基础概念--躯壳篇)
第三篇:JavaScript--我发现,原来你是这样的JS(三)(基础概念--灵魂篇)
第四篇:JavaScript--我发现,原来你是这样的JS(四)(看看变量,做用域,垃圾回收是啥)
第五篇:JavaScript--我发现,原来你是这样的JS(引用类型不简单[上篇],且听我娓娓道来)
第六篇:JavaScript--我发现,原来你是这样的JS(引用类型不简单[下篇],基本包装类型与个体内置对象)
本文出自博客园:http://www.cnblogs.com/Ry-yuan/ 做者:Ry(渊源远愿) 欢迎转载,转载请标明出处,保留该字段。