js-begin chapter06 对象

来源:互联网 发布:legacy安装ubuntu 编辑:程序博客网 时间:2024/06/03 13:34

一、对象
1、对象:属性的无序集合。属性包括名字和值。
(1)属性名:包括空字符串在内的任意字符串。
(2)属性值:任意javascript值或getter/setter函数?
(3)属性特性:
可写:是否可设置该属性的值
可枚举:是否可通过for/in循环返回该属性
可配置:是否可删除或修改该属性
(4)对象的原型:指向另外一个对象,本对象的属性继承自它的原型对象
(5)对象的类:一个标识对象类型的字符串
(6)对象的扩展标记:是否可向该对象添加新属性。
(7)对象类型:
内置对象:数组、函数、日期、正则表达式
宿主对象:js解释器嵌入的宿主环境定义的。如:HTML Element对象都是宿主对象(也可以当作内置对象,因为宿主环境定义的方法可以当成普通的js函数对象)。
自定义对象:运行中js代码创建的对象。
自有属性:直接在对象中定一的属性。
继承属性:对象的原型对象中定义的属性。
二、创建对象
1、通过对象直接量创建:
2、关键字new创建
3、原型
(1)每一个js对象除了null外都和另一个对象(原型)相关联,都从这个原型继承属性。
(2)
var point1 = {}
var point2 = {
x:2;
y:3;
}
point1:
object{}
prototype:object
……..
point2:
object{x:2,y:3}
x:2
y:3
prototype:object
…….
var arr1 = []
var arr2 = new Array()
arr1/arr2:
Array[0]
length:0
prototype:Array[0]
……
prototype:object
……..
(3)Object.prototype对象没有原型,不继承任何属性。其他原型对象都是普通对象,都具有原型,所有的内置构造函数和大部分自定义的构造函数都具有一个继承自object.prototype的原型。
如:arr1是由new Array()创建的,这个对象的属性同时继承自Array.prototype和Object.prototype.(因为Array.prototype继承自Object.prototype吧)
4、Object.create()创建
(1)创建没有原型的新对象:
var point = Object.create(null);
这种方法创建的对象不会继承任何东西,甚至不包括基础方法,如toString()
point:
object:{}
no properties
(2)创建一个普通的空对象
var point = Object.create(Object.prototype);
point:
object:{}
prototype:object
…….
5、inherit()函数?
四、属性的查询和设置
(1)js是弱类型语言,在任何对象中程序都可以创建任意数量的属性。
(2)
通过.来访问对象的属性时,不可改变属性名;
通过[]访问对象的属性时,属性名通过字符串表示,可以在程序运行时修改和创建他们。
五、继承
1、inherit函数:
function inherit(p){
if(p == null)
trow TypeError;
if(Object.create)
return Object.create(p);
var t = typeof p;
if(t!== “object” && t!== “function”)
throw TypeError;
function f(){
}
f.prototype = p;
return newf();
}
var p1= inherit(point);
var p2 = Object.create(point);
function g(){};
g.prototype = point;
var p3 = new g();

2 、允许属性赋值操作,总是在原始对象上创建属性或对已有的属性赋值,而不会修改原型链。
point1 = Object.create(point);
point1.x = 33 //point1.x:33; point1.y:4; point.x:3
3、setter的accessor属性?
六、属性访问错误
1、试图访问或设置不存在对象(null, undefined)的属性时就会报错。
2、
当属性是只读时,不可重新赋值;(defineProprty()例外)
当对象不允许新增属性,不可新增属性。(在”use strict”下会报错)
当对象的属性时继承的只读属性,不可覆盖
当对象不存在自有属性:对象没有使用setter方法继承属性p,且对象的可扩展性时false????
七、删除属性
1、delete只能删除自有属性,不能删除继承属性,要删除继承属性,必须从定义这个属性的原型对象上删除,且会影响所有继承自这个原型的对象。
var point = {
x:2,
y:3
}
var point2 = Object.create(point)
point:
x:2
y:3
proto:object
……
point2:
protot:object
x:2
y:3
proto:object
delete point2.x //什么都没做,结构不变
delete point.x //结构如下:
point:
y:3
proto:object
……
point2:
protot:object
y:3
proto:object
(2)delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性,所以在销毁对象的时候,要遍历属性中的属性,依次删除:
var point1 ={
p:{x:1}
}
var point2 = point1.p
point1:
p:object
x:1
proto:object
proto:object
point2:
x:1
proto:object
delete point2.p //无任何影响
delete point1.p 结构如下:
point1:
proto:object
point2:
x:1
proto:object

delete point2.x :结构如下:
point1:
p:object
proto:object
proto:object
point2:
proto:object

var point3 = Object.create(point1.p)
delete point3.x //结构无变化 ;
比较delete point2.x和的;delete point3.x。
八、检测属性:判断某个属性是否存在于某个对象中
1、in运算符
var o = {x:1}
console.log(“x” in o)//true
console.log(“y” in o)//false
console.log(“toString” in o)//true
2、hasOwnProperty():检测给定的名字是否是对象的自有属性
3、propertyIsEnumerable():是hasOwnProperty()的增强版,只有检测到是自有属性且这个属性的可枚举性为true时才返回true
4、!== :判断一个属性是否为undefined
九、枚举属性
1、fot/in循环可在循环体中遍历对象中所有可枚举的属性,包括自有属性和继承的属性,把属性名赋值给循环变量。对象继承的内置方法是不可枚举的,但是在代码中给对象添加的属性都是可枚举的。
十、属性getter和setter
十一、属性的特性
十二、对象的三个属性
1、原型属性:
p.isPrototypeOf(o):检测p是否是o的原型。
2、类属性
classof
3、可扩展性:
(1)可扩展是指是否可以给对象添加新属性
(2)ES5中,所有的内置对象和自定义对象都是可扩展的。
(3)Object.esExtensible()判断对象是否可扩展。
(4)Object.preventExtensions()将对象转换为不可扩展,该过程不可逆,且只影响对象本身的可扩展性,如果给该不可扩展对象的原型添加属性,那么这个不可扩展的对象同样会继承这些属性。
(5)Object.seal()
Object.isSealed()
(6)Object.freeze()
Object.isFrozen()
十三、序列化对象
1、对象序列化是指将对象的状态转换为字符串。
2、JSON.stringify():序列化对象
JSON.parse():用来还原对象
var point = {
x:1,
y:2,
get r(){
return this.x*this.x+this.y*this.y;
},
set r(newv){
var old = this.x*this.x+this.y*this.y;
var ratio = newv/old;
this.x *= ratio;
this.y *= ratio;
},
}
console.log(p)
console.log(JSON.stringify(p))
console.log(JSON.parse(JSON.stringify(p)))
十四、对象方法
1、toString()方法:当需要将对象转换为字符串时,js会调用这个方法。如:字符串+对象或在希望使用字符串的方法中使用了对象时。
2、toLocaleString()方法:返回表示这个对象的本地化字符串。
Object默认的toLocaleString()不做任何本地化自身的操作,仅调用toString()返回对应值。Date和Number会toLocaleString()方法做了定制,可以用它对数字,日期和时间做本地化的转换。
3、toJSON()方法:
Object.prototype没有定义toJSON()方法,但是对于需要执行序列化的对象来说,JSON.stringify()会调用toJSON方法。
Date.toJSON()
4、ValueOf():当需要将对象转换为某种原始值而非字符串的时候,需要调用。

0 0
原创粉丝点击