关于JavaScript对象概念的总结
原文
https://www.jianshu.com/p/88213b499c4b
大纲
前言
1、对象的相关概念
2、对象的创建(简单创建)
3、对象的属性
3.1、数据属性
3.2、访问器属性
4、设置和读取对象中的属性
5、变量存储的是对象的引用
6、基本数据类型可以自动转换成对象数据类型
7、获取对象属性的点方法和中括号法的区别
前言
以下论述是我关于对象的知识点的认识和理解,其中包括了对象是什么?创建对象的基本方式以及对象的相关概念的讲解,希望能给读者带来一些帮助。
1、对象的相关概念
1、ECMAScript是基于对象(Object)的,对象是属性(properties)的集合,每个属性有零个或多个特性(attributes),它确定怎么使用此属性。
2、ECMAScript通过对象确定调用者要调用的地方,通过调用对象的属性和方法可以来满足调用者要怎么调用对象。
3、ECMAScript对对象的定义:无序属性的集合,其属性可以包含基本值、对象或者函数。
4、对象是属性的集合,并有一个原型对象。原型可以是空值。严格来说,这就相当于说对象是一组没有特定顺序的值。
5、对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。正因为这样,我们可以把ECMAScript的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数。
6、JavaScript本身包含许多对象,这些对象称之为JavaScript的内建对象。
7、浏览器自身也是对象集合的模型,可以通过浏览器对象来操作浏览器,浏览器对象模型(BOM),文档对象模型(DOM)
8、对象的存在是为了解决基本数据类型的局限性
9、对象是自我包含的数据集合,包含在对象里的数据可以通过两种形式——即属性(property)和方法(method)访问:
a:属性是隶属于某个特定对象的变量;
b:方法是只有某个特定对象才能调用的函数。
10、实例是对象的具体表现:对象是统称,实例是个体。
11、有些对象(如:person)在JavaScript语言里并不存在。我们可以利用JavaScript语言来创建自己的对象——术语称之为用户定义对象(user-defined object)。有些对象
(如:Array、Date)在JavaScript语言中预先定义好的对象,而我们可以把这些对象直接在自己的脚本里运用,人们把这些对象称为内建对象(native object)。
2、对象的创建(简单创建)
//1、Object var person = new Objcet(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function(){ console.log(this.name); } //2、对象字面量 var person = { name:"Nicholas"; age:29, job:"Software Engineer", sayName: function(){ console.log(this.name); } }
3、对象的属性
ECMAScript中有两种属性:数据属性和访问器属性
3.1、数据属性
/* 数据属性包含一个数据值的位置,在这个位置可以读取和写入值 */ var person = { name : "Nicholas" }; >/操作数据属性 /* 通过delete、add来操作数据属性 对未声明的数据属性进行赋值相当于先创建这个属性然后再对这个属性进行赋值 */ 'use strice' var person = { name : "personName", age : 23 } delete person.age; person.type = 'chinese'; console.log(person);//{name: "personName", type: "chinese"} >/通过Object.defineProperty() /* 可以通过 Object.defineProperty(ObjectName , attrituteName , {descriptor : true/false}); 来操作对象的属性 */ 'use strice' var person = { name : "personName", age : 23 } console.log(person);//{name: "personName", age: 23} person.name = "hh"; console.log(person);//{name: "hh", age: 23} // Object.defineProperty(person,"name",{ // writable : false // })//标准格式 Object.defineProperty(person,"name",{ writable : false, value : "kk" }) console.log(person);//{name: "kk", age: 23} person.name = "gg"; console.log(person);//{name: "kk", age: 23}
3.2、访问器属性
/* 访问器属性不包含数据值:它们包含一对儿getter和setter函数(不过这两个函数都不是 必需的)。 在读取访问器属性是,会调用getter函数,这个函数负责返回有效值; 在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据 */ >/ 操作访问器属性 //访问器属性:yyy 'use strice' var book = { _year : 2004, edition : 1 }; console.log(book); Object.defineProperty(book,"yyy",{ get:function(){ return this._year; }, set:function(newValue){ if(newValue > 2004){ this.edition += newValue - this._year; this._year = newValue; } } }); console.log(book.yyy); book.yyy = 2008; console.log(book.yyy); console.log(book);
4、设置和读取对象中的属性
//1、设置某个属性的特性 Object.defineProperty(ObjectName , attrituteName , {descriptor : true/false}); //2、设置多个属性的特性 Object.defineProperties(ObjectName , {attrituteName : {descriptor : true/false} , attrituteName : {descriptor : true/false}}); //3、读取属性的特性 var descriptors = Object.getOwnPropertyDescriptor(ObjectName,attrituteName); console.log(descriptors.descriptorName);
5、变量存储的是对象的引用
1、当我们创建对象并把创建的对象赋值给一个用var声明的变量,这个变量中存储的是这个对象的地址,是这个对象的引用而不是对象本身的赋值。
2、由于变量存储的是对象的引用,所以一些看似是对该变量‘对象’的操作,其实实质上是对这个变量包含的引用所指向的对象的操作,而不是对这个变量的操作,因为这个变量中不是什么对象,而是一个地址引用。
6、基本数据类型可以自动转换成对象数据类型
1、对于一些基本数据类型,其实他们也具有对应的对象类型。
2、当一些数据可以表明自己是哪种基本数据类型,当调用到该基本数据类型对应的对象数据类型的时候,JavaScript就会自动的将该基本数据类型转换成对象数据类型。
7、获取对象属性的点方法和中括号法的区别
//1、中括号法可以用变量作为属性名,而点方法不可以; var obj = {}; obj.name = '张三'; var myName = 'name'; console.log(obj.myName);//undefined,访问不到对应的属性 console.log(obj[myName]);//张三 //2、中括号法可以用数字作为属性名,而点语法不可以; //3、中括号法可以使用js的关键字和保留字作为属性名,而点语法不可以(尽量避免在变量或者属性中使用关键字或保留字);