JavaScript学习笔记整理(4):对象
JavaScript是面向对象编程(Object Oriented Programming,OOP)语言。
1、对象
在Javascript中,对象是一个基本数据类型。
对象是一种复合值:它将很多值集合在一起,可通过名字访问这些值。对象也可看做一种无序的数据集合,由若干个“键值对”(key-value)构成。
var o={
name:'a'
}
var o={
name:'a'
}
上面代码中,大括号定义了一个对象,它被赋值给变量o。这个对象内部包含一个键值对(又称为“成员”),name是“键名”(成员的名称),字符串a是“键值”(成员的值)。键名与键值之间用冒号分隔。如果对象内部包含多个键值对,每个键值对之间用逗号分隔。
键名:对象的所有键名都是字符串,所以加不加引号都可以。如果键名是数值,会被自动转为字符串。
对象的每一个“键名”又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。
var o = {
go: function(x){
return x+1;
}
};
o.go(2) // 3
var o = {
'1a' : 'a'
}
对象直接量: var o={};
关键字new: var o=new Object();
Object.create()函数: var o=Object.create(null)
2.1对象直接量var o1 = {};
var o2 = new Object();
var o3 = Object.create(null);
上面三行语句是等价的。var o = {
name : 'a'
}
o.name // "a"
o['name'] //"a"
在JavaScript中,我们可以通过点(.)或方括号([])运算符来获取属性的值。运算符左侧应当是一个表达式,它返回一个对象。
for...in
for...in循环用来遍历一个对象的全部属性。
var o = {
name : 'a',
age : 12
}
for(var i in o){
console.log(o[i]
}
// "a"
// 12
var o = {
name : 'a',
age : 12
}
for(var i in o){
console.log(o[i]
}
// "a"
// 12
查看所有属性
查看一个对象本身的所有属性,可以使用Object.keys方法,返回一个数组。
var o = {
name : 'a',
age : 12
}
Object.keys(o) //['name','age']
var o = {
name : 'a',
age : 12
}
Object.keys(o) //['name','age']
删除属性
delete运算符可以删除对象的属性。
var o={
name : 'a'
}
delete o.name //true
o.name //undefined
注意:delete运算符只能删除自有属性,不能删除继承属性。
var o={
name : 'a'
}
delete o.name //true
o.name //undefined
删除一个不存在的属性,delete不报错,而且返回true。
只有一种情况,delete命令会返回false,那就是该属性存在,且不得删除。
检测属性
在JavaScript中,有多种方法检测某个属性是否存在于某个对象中。
hasOwnPreperty()方法
propertyIsEnumerable()方法
只有检测到是自有属性且这个属性的可枚举性为true时才返回true。
in运算符
in运算符左侧是属性名(字符串),右侧是对象。如果对象的自有属性或继承属性中包含这个属性就返回true。
var o = {
name : 'a'
}
'name' in o //true
var o = {
name : 'a'
}
'name' in o //true
6、对象的三个属性
每一个对象都有与之相关的原型(prototype)、类(class)和可扩展性(extensible attribute)
将对象作为参数传入Object.getPrototypeOf()可以查询它的原型。
检测一个对象是否是另一个对象的原型,可以使用isPrototypeOf()方法。
7、序列化对象
对象序列化是指将对象的状态转换为字符串,也可将字符串还原为对象。
在JavaScript中,提供了内置函数JSON.stringify()和JSON.parse()用来序列化和还原JavaScript对象。
NaN、Infinity和-Infinity序列化的结果是null
var o = {
name : 'a',
age : 12,
intro : [false,null,'']
}
s= JSON.stringify(o) // s {"name":"a","age":12,"intro":[false,null,""]}
p=JSON.parse(s) // p是o的深拷贝
注意:JSON.stringify()只能序列化对象可枚举的自有属性。对于一个不能序列化的属性来说,在序列化后的输出字符串中会将这个属性省略掉。
函数体内使用了this关键字,代表了所要生成的对象实例
生成对象时,必需用new命令
function Car(){
this.color = 'black';
}
var c = new Car();
function Car(color){
this.color = color;
}
var c = new Car('red');
var c = new Car();
var c = new Car;
this.property
var A = {
name: '张三',
describe: function(){
return this.name;
}
};
var B = {
name: '李四'
};
B.describe = A.describe;
B.describe();
// "李四"
call(obj, arg1, arg2, ...)
apply(obj,[arg1,arg2....])
bind(obj)
9、原型
9.1 原型
每一个JavaScript对象(null除外)都和另一个对象相关联,也可以说,继承另一个对象。另一个对象就是我们熟知的“原型”(prototype),每一个对象都从原型继承属性。只有null除外,它没有自己的原型对象。
所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过JavaScript代码Object.prototype获得对原型对象的引用。
通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。比如:通过new Object()创建的对象继承自Object.prototype;通过new Array()创建的对象的原型就是Array.prototype。
没有原型的对象为数不多,Object.prototype就是其中之一,它不继承任何属性。
所有的内置构造函数都具有一个继承自Object.prototype的原型。
9.2 原型链
如果对象自身和它的原型,都定义了一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”(overiding)。
9.2.1 contructor属性
prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数。
9.3 操作符
(1)instanceof运算符
instanceof运算符返回一个布尔值,表示指定对象是否为某个构造函数的实例。
var c = new Car();
c instanceof Car //true
instanceof运算符的左边是实例对象,右边是构造函数。它的运算实质是检查右边构建函数的原型对象,是否在左边对象的原型链上。
(2)Object.getPrototypeOf()
Object.getPrototypeOf方法返回一个对象的原型。这是获取原型对象的标准方法
Object.getPrototypeOf(c) === Car.prototype //true
(3)Object.setPrototypeOf()
Object.setPrototypeOf方法可以为现有对象设置原型,返回一个新对象。Object.setPrototypeOf方法接受两个参数,第一个是现有对象,第二个是原型对象。
(4)Object.create()
Object.create方法用于从原型对象生成新的实例对象,可以替代new命令。
它接受一个对象作为参数,返回一个新对象,后者完全继承前者的属性,即原有对象成为新对象的原型。
(5)Object.prototype.isPrototypeOf()
对象实例的isPrototypeOf方法,用来判断一个对象是否是另一个对象的原型。
Object.prototype.isPrototypeOf({}) //true
(6)Object.prototype.__proto__
__proto__属性(前后各两个下划线)可以改写某个对象的原型对象。
(7)Object.getOwnPropertyNames()
Object.getOwnPropertyNames方法返回一个数组,成员是对象本身的所有属性的键名,不包含继承的属性键名。
(8)Object.prototype.hasOwnProperty()
对象实例的hasOwnProperty方法返回一个布尔值,用于判断某个属性定义在对象自身,还是定义在原型链上。