面向对象的语言有一个标志,他们都有类的概念,通过类可以创建多个具有相同属性和方法的对象。但是 JavaScript 中没有类的概念,因此 JavaScript 与其他的面向对象语言还是有一定区别的。JavaScript 把对象定义为无序属性的集合,其属性可以包含基本值、对象或者函数。对象的每个属性或者方法都有一个名字,而每个名字都映射到一个值。所有我把 JavaScript 的对象看成一组无序的键值对。
对象是什么以前曾介绍过对象的创建,建立对象最简单的方式就是建立 Object 对象的一个实例,再为他添加属性和方法。
- var obj = new Object();
- obj.name = "test";
- obj.getName = function() {
- return this.name;
- }
- console.log(obj.getName());
上面的代码第一行创建了一个对象 obj,第二行给 obj 添加了属性 name,第三行给 obj 添加了方法 getName。通过 getName 方法能够获取 obj 属性 name 的值。第六行输出字符串 test。
- var obj = {};
- obj.name = "test";
- obj.getName = function() {
- return this.name;
- }
- console.log(obj.getName());
上面的代码通过字面量创建了对象 obj。其他与通过 Object 创建的完全一样。
对象的属性JavaScript 有两种属性:数据属性和访问器属性。
数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有 4 个描述其行为的特性。
Configurable:表示能否通过 delete 关键字删除属性或者把属性修改为访问器属性。configurable 默认是 true。
Enumerable:表示能否通过 for-in 循环,默认值为 true。
Writable:表示能够修改属性的值,默认为 true。
Value:包含这个数据的属性值。读取属性值时,从这个位置读。写入属性值的时候,把新值保存在这个位置。默认为 undefined。
对于像前面那样定义对象,他的 configurable、enumerable 和 writable 默认都是 true,value 是指定给它的值。
- var obj = {
- name: "test";
- }
这创建的对象 obj 拥有一个属性,并设置 value 值为 test。要修改默认属性必须使用 Object.defineProperty() 方法。这个方法接收三个参数:属性所在的对象、属性的名字和描述符。描述符对象的属性必须是 configurable、enumerable、writable 和 value 中的一个或者多个。
- var obj = {};
- Object.defineProperty(obj, "name", {
- configurable: true,
- value: "hehe",
- enumerable: true,
- writable: false
- });
- obj.name = "test";
- console.log(obj.name); //输出hehe
这个例子创建了一个属性 name,并设置 wriable 为 false,也就是说 name 属性的 value 将无法写入。所在我在第九行修改 name 的值,并没有效果。name 的值依然为 test。
把 configurable 设置为 false 之后,该属性就将无法通过 delete 删除,同时也不能通过 Object.defineProperty() 方法设置除 writable 之后的值。在严格模式下,如果调用该方法将会报错。
当通过 Object.defineProperty 方法定义属性的时候,configurable、enumerable 和 writable 特性的默认值是 false。所以,最好不要通过该方法定义属性。
访问器属性不包含 value,但是包含一对 getter 和 setter 函数。在读取访问器属性时,会调用 getter 函数。在写入访问器属性时,会调用 setter 函数。访问器属性有以下四个特性:
Configurable:表示能否通过 delete 关键字删除属性或者把属性修改为访问器属性。configurable 默认是 true。
Enumerable:表示能否通过 for-in 循环,默认值为 true。
get:在读取属性的时候调用的函数,默认值为 undefined。
set:在写入属性的值时调用的函数,默认是 undefined。
- var person={"_name":"hehe","age":18}
- Object.defineProperty(person,"name",{
- get:function(){
- return this._name;
- },
- set:function(str){
- if(this._name!="haha"){
- this._name=str;
- this.age="19";
- }
- }
- });
- person.name="haha";
- console.log(person.name+":"+person.age);//haha:19
上面的代码创建了一个对象 person,并定义了两个属性_name 和 age。_name 表示内部属性,一般由对象本身去访问。定义了属性 name,有 get 和 set 方法。不一定要同时定义 get 和 set 方法。只有 get 方法,则尝试写入属性的时候报报错。只有 set 方法,则获取属性的时候会报错。通过 Object 的 defineProperties 能够同时定义多个属性。
- var obj = {};
- Object.defineProperties(obj, {
- name: {
- value: "hehe"
- },
- age: {
- value: "18"
- }
- });
- console.log(obj.name + ":" + obj.age); //hehe:18
上面的代码,通过 Object 的 defineProperties 方法同时定义了两个属性 name 和 age。该方法的第一个参数是对象,第二个参数是由需要定义的属性组成的对象。
JavaScript 提供了 Object.getOwnPropertyDescriptor 方法,可以获取属性的描述符。这个方法需要两个参数:第一个参数是对象,第二个参数是描述符属性的名称。返回值是一个对象,如果是访问器属性则有 configurable、enumerable、writable、get 和 set。如果是数据属性,这个对象有属性 configurable、enumerable、writable 和 value。
- var obj = {};
- Object.defineProperties(obj, {
- name: {
- value: "hehe"
- },
- age: {
- value: "18"
- },
- _sex: {
- value: "man"
- },
- sex: {
- get: function() {
- return this._sex;
- },
- set: function(str) {
- this._sex = str;
- }
- }
- });
- var descriptor1 = Object.getOwnPropertyDescriptor(obj, "name");
- var descriptor2 = Object.getOwnPropertyDescriptor(obj, "sex");
- console.log(descriptor1.writable); //false
- console.log(descriptor2.get); //function
- console.log(obj.name + ":" + obj.age + "," + obj.sex); //hehe:18,man
上面的代码,通过 Object.getOwnPropertyDescriptor() 方法获取属性的描述吗,分别获取了数据属性以及访问器属性。
来源: https://www.cnblogs.com/ggz19/p/8194733.html