您的位置:首页 > Web前端 > JavaScript

JavaScript对象的创建和对象属性操作详解

2018-03-27 22:37 726 查看
在正式介绍对象创建和属性操作之前,先普及几个概念:
三类JavaScript对象:
1.内置对象:由ECMAscript规范定义的对象。例如array、date对象。
2.宿主对象:由js解释器所嵌入的宿主环境(如web浏览器)所定义的对象。
3.自定义对象:这大家肯定都知道,是有运行中的js代码创建的对象。
两类js对象属性:
1.自由属性:直接在本对象中定义的属性。
2.继承属性;在对象的原型对象中定义的属性。(原型是js中特别重要的一个概念,我会写一篇专门的博客来介绍它)
三个对象特性(也就是对象的三个比较重要的属性,这里不做详细介绍):
1.对象的原型:原型指向另外一个对象,本对象继承自它的原型对象。
2.对象的类:一个标志对象类型的字符串。
3.对象的扩展标记:指明了是否可以向该对象添加新的属性。

正式进入主题:

一、创建对象的三个方法:

1.对象字面量:这是创建对象的最简单的方式。给个例子再慢慢给你介绍:                var empty = {}; //没有任何属性的对象。
    var point = {x:0,y:1}; //两个简单的属性。
    var point2 = {x:point.x, y:point.t+1};      //复杂点的属性值。
    var book ={
"main title" : "javascript", //属性名间有空格时,必须用引号
4000

"sub-title" : "the Definitive Guide", //属性名间有连字符时,必须用引号
"for" : "all audiences", //“for”是保留字,必须用引号
author : { //这里的属性的值是一个对象
firstname : "david",
secondname : "flange"
}
}        对象字面量创建对象时的一些注意点:
a.在上面代码的注释中提到了一些。
b.对象直接量(也称对象字面量)中的最后一个属性后的逗号将忽略(即不要写)。

c.对象字面量是一个表达式,每次运行都会创建并初始化一个新的对象。
        2.通过new创建对象:

new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这个函数称作构造函数。例如: var wlk = new Object(); //创建一个空对象,和{}一样。
var wlk2 = new Array(); //创建一个空数组,和[]一样。js语言核心中的原始类型都包含内置构造函数。        3.Object.create()方法创建对象:
Object.create()是一个静态函数,而不是提供给某个对象调用的方法。该方法的第一个参数是这个对 象的原型,即创建的对象继承自第一个参数所对应的对象。第二个是可选参数,用于对对象的属性进一步描述。例如:var wlk = Object.create({x:1,y:2}); //wlk继承了属性x和y。
var wlk2 = Object.create(Object.prototype);//创建一个{}一样的空对象。

二、属性的相关操作:

1.属性值的获取和设置:
总的来说有(.)和([])两种运算符来获取属性值。当然这两个运算符也可以用来创建属性或给属性赋值。当我们用方括号时,方括号内的表达式必须返回字符串。更严格讲,表达式返回字符串或者一个可以转换为字符串的值。
关联数组:数组元素是通过字符串索引而不是通过数字索引的数组就是关联数组。js对象就是关联数组。
总体评价两种方式的话我会这样说:[]号比.号更加灵活。
        何出此言?使用[]时,字符串值是动态的,可以在运行时修改,而标识符(也就是 使用.号)不行。
举个例子:
var addr = "";
    for(i = 0;i<4;i++){
addr+=customer["address"+i]+'\n';
}额外的。在讨论属性的获取和设置时要稍微牵扯到点继承和原型链。
    1.1.继承的属性会被本对象的同名属性所覆盖。
    1.2.查询属性值时会访问原型链,而设置属性值只在本对象上操作。当然有个例外:“存取器属性”(详细可见《权威指南6》第六章第6小节)。

2.删除属性:
    delete运算符可以删除属性。值得注意一点:delete只是断开属性和对象的联系,而不会去操作属性中的属性。有点绕?
举个例子:
a = {p:{x:1}};
b = a.p;
delete a.p;
执行这段代码后,b.x的值依然是1。由于删除的属性的应用依然存在。
    2.1.delete不能删除那些可配置性为false的属性。
    2.2.delete不能删除内置对象的属性。
        比如:var x = 1;delete this.x; //声明x为全局属性。

3.检测属性:

     检测属性有四种方式:in运算符、hasOwnProperty()、propertyIsEnumerable()、!==。
    3.1.in运算符:左侧是属性名(字符串),右侧是对象。如果对象的自有属性和继承属性中包含这个属性则返回true。
var o = {x:1};
"x" in o;    //true,"x"是自有属性
"y" in o;    //false,"y"不是其属性
"toString" in o //true,o继承的属性。
    3.2.hasOwnProperty()方法:
    用来检测给定的名字是否是对象的自有属性。对于继承属性它将返回false。
var o = {x:1};
o.hasOwnProperty("x");    //true,自有属性x
o.hasOwnProperty("y");    //false,不存在这个属性
o.hasOwnProperty("toString");   //false,这是继承属性,不是自有属性
    3.3.propertyIsEnumerable()方法:
    它其实是hasOwnProperty()的增强版。只有检测到自有属性且这个属性是可枚举的才返回true。
    3.4."!=="判断:
var o = {x:1};
o.x !== undefined; //true,o中有属性x
o.y !== undefined; //false,o中没有这个属性
o.toString !== undefined; //true,继承了该属性    然而有一种场景只能用In运算符而不能使用上述!==方式:in可以区分不存在的属性和存在但是值为undefined的属性。

4.枚举(遍历)属性:

    提醒一点:对象属性是不可重复的。
    4.1.for/in循环:可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承属性)。var o = {x:1,y:2,z:3}; //三个可枚举的自由属性
O.propertyIsEnumerable("toString"); // false,这是不可枚举的属性
for( p i o) //遍历属性
{
    console.log(p); //输出x,y,z.不会输出toString。
}  4.2.ECMAScript5定义了两个用于枚举属性名称的函数:Object.keys(),Object.getOwnPropertyNames().
     Object.keys():返回一个数组,这个数组有对象中可枚举的自由属性的名称组成。
     Object.getOwnPropertyNames():和Object.keys()类似,只是它返回对象的所用自有属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: