VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 网站开发 > JavaScript >
  • JavaScript教程之js权威指南学习笔记(四)对象

1、创建对象

(1)、通过对象直接量的方式创建
说明:对象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。
如:
 
 
 
 
1
var empty = {}; //创建一个空对象
2
var point = {
3
    x : 0,
4
    y : "ccc
5
}
 
 
对象直接量是一个表达式,每次运算都会创建并初始化一个新的对象。
(2)、通过new创建对象
new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数称作构造函数(constructor),构造函数用于初始化一个新创建的对象。
如:
 
 
 
 
1
var o = new Object();     //创建一个空对象
 
 
(3)、Object.create()
它创建一个新对象,其中第一个参数是这个对象的原型,第二个为可选参数,用以对对象的属性进一步描述。
它是一个静态函数,而不是提供给某个对象调用的方法。
如:
 
 
 
 
1
var o = Object.create({ x: 1, y: 2});     //o继承了属性x和y
2
var o2 = Object.create(Object.prototype);    //创建一个空对象
 
 
2、属性的查询和设置
当通过[]来访问对象的属性时,属性名通过字符串来表示。
使用[]运算符访问时,字符串值是动态的,可以在运行时更改。
使用 . 运算符访问时,后接的是标识符,标识符是静态的,写死在程序中。
不同的场景可以使用不同的运算符来进行访问。
(1)继承
对属性赋值操作时首先要检查原型链,以此判定是否允许赋值。
如果一个对象继承自另一个对象的一个自读属性,那么赋值操作是不允许的。
如果允许属性赋值操作,它总是在原始对象上创建属性或对已有的属性赋值,而不会去修改原型链。
 
 
 
 
1
//这里使用es5 的Object.create()函数来创建对象
2
var o = {r: 1};    //一个用来继承的对象
3
var c = Object.create(o);     //创建一个新对象c,c继承o对象属性r
4
c.x = 1; c.y = 2;     //c定义两个属性
5
c.r = 2;     //c覆盖继承来的属性
6
console.log(o.r);    //1 原型对象没有修改
 
 
(2)、属性访问错误
在一下这些场景下给对象o设置属性p会失败:
  • o中的属性p是只读的:不能给只读属性重新赋值(defineProperty()方法中有一个例外,可以对可配置的只读属性重新赋值)。
  • o中的属性p是继承属性,且它是只读的:不能通过同名自有属性覆盖只读的继承属性。
  • o中不存在自有属性p:o没有使用setter方法继承属性p,并且o的可扩展性是false。如果o中不存在p,而且没有setter方法可供调用,则p一定会添加至o中。但如果o不是可扩展的,那么在o中不能定义新属性。
3、删除属性
通过delete运算符可以删除对象的属性。
delete运算符只能删除自有属性,不能删除继承属性。(要删除继承属性必须从定义这个属性的原型对象上删除它,而且这会影响到所有继承自这个原型的对象)。
delete不能删除那些可配置性为false的属性。(尽管可以删除不可扩展对象的可配置属性)
 
 
 
 
1
o = {x:1};
2
delete o.x;    //true
3
delete o.x;     //什么也没做(x已经不存在),返回true
4
delete o.toString;     //什么也没做(toString是继承来的) ,返回true
5
delete 1;     //无意义,返回true
6
delete Object.prototype;     //不能删除,属性是不可配置的
 
 
4、检测属性
(1)、in运算符
用于检测一个对象是否包含某个属性,如果对象的自有属性或继承属性中包含这个属性则返回true。
如:
 
 
 
 
1
var o = { x:1 };
2
"x" in o;     //true "x"是o的属性
3
"y" in o;    //false    "y"不是o的属性
4
"toString" in o;     //true o继承toString属性
 
 
(2)、hasOwnProperty()方法
用来检测给定的名字是否是对象的自有属性,对于继承属性它将返回false。
如:
 
 
 
 
1
var o = { x:1 };
2
o.hasOwnProperty("x");    //true o有一个自有属性x
3
o.hasOwnProperty("y");    //false o中不存在属性y
4
o.hasOwnProperty("toString");    //false toString是继承属性
 
 
(3)、propertyIsEnumerable()方法
它用来检测是自有属性且这个属性的可枚举性为true时它才返回true。
某些内置属性是不可枚举的,通常由javascript代码创建的属性都是可枚举的。如
 
 
 
 
1
var o = Object.create({ y: 2});
2
o.x = 1;
3
o.propertyIsEnumerable("x");    // true: o有一个可枚举的自有属性x
4
o.propertyIsEnumerable("y");    //false y是继承来的
5
Object.prototype.propertyIsEnumerable("toString");    //false 不可枚举
 
 
(4)、判断一个属性是否是undefined
使用 “ !== ”,如
 
 
 
 
1
var o = { x:1 };
2
o.x !== undefined;     //true o中有属性x
3
o.y !== undefined;     //false o中没有属性y
4
o.toString !== undefined;     //true o继承了toString属性
5