JS对象与原型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向对象设计-->引用类型(function string number array date) ----->Object---->对象原型----->函数表达式--->数据类型
面向对象:类和对象,通过类可以创建任意多个具有相同属性和方法的对象。
ECMA定义对象:无序属性的集合,其属性可以包含基本值、对象或者函数。相当于一组没有特定顺序的值,对象的每个属性或方法都有一个名字,而每个名字映射到一个值。
即:对象就是一组键值对,其中值可以是数据或函数。
每个对象都是基于一个引用类型创建的。
Object是所有JS对象的基类
prototype是对象的原型
obj.constructor是创造该对象的构造器
一、创建自定义对象
var person = new Object();
="dujie";
person.say = function(){alert()};
字面量法:
var person = {
name:"dujie",
say:function(){alert();}
}
二、对象属性
内部采用的特性,描述了属性的各种特征,这些特性是为了实现JavaScript引擎用的,在js中不能直接访问,为了表示特性是内部值,规范把他们放在了两对方括号里例如:[[Enumerable]]
ECMAScript中有两种属性:数据属性和访问器属性
1.数据属性:包含一个数据值的位置,行为(在这个位置可以读取和写入值)
4个描述行为:
@1.[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性或者能否把属性修改为访问器属性。默认值为true
@2.[[Enumerable]]:表示能否通过for-in循环返回属性,默认为true
@3.[[Writable]]:表示能否修改属性的值默认为true
@4.[[Value]]:包含这个属性的数据值。默认为undefined,从这个位置读取或写入保存属性的值
定义对象时var person={name:"dujie"} [[Value]]特性将被设置为"dujie"
若要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法
Object.defineProperty(obj,"属性名",描述符对象)
描述符对象的属性必须是configurable enumerable writable value
例如:
var person = {};
Object.defineProperty(person,"name",{
writable:false, 属性值不可以修改,变成只读
configurable:false 不可从对象中删除属性delete 无效果
value:"dujie"
});
alert() //dujie
="jack";
alert() //dujie
注意:可以多次调用Object.defineProperty()方法修改同一属性的特性,但是把configurable特性设置为false 后就会有限制,除writable之外的特性都会报错
原型对象
模仿类,实例化对象
实例化对象流程:
1.创建obj = new Object()
2.将obj的内部__proto__指向构造函数A的prototype属性,同时obj.constructor ===
A.prototype.constructor 类的实例对象的constructor属性永远指向构造函数的prototype.constructor,
构造函数person
原型对象person.prototype
对象实例person1
三者的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
原型链:原型对象等于另一个类型的实例,将包含一个指向另一个原型的指针,相应地另一个原型中也包含指向另一个构造函数的指针,层层递进,构成了原型连
在实例中无法访问prototype属性,可通过isPrototypeOf()方法来确定对象之间是否存在这种关系person.prototype.isPrototypeOf(person1)//返回true 因为person1内部有一个指向person.prototype的指针,所以返回true
如果实例中的prototype指向调用isPrototypeOf()方法的对象(person.prototype),就返回true
ECMAScript 5 增加方法:Object.getPrototypeOf() 返回[[Prototype]]的值(对象原型)
(IE9+ Firefox3.5 Safari5+ Opera12+ Chrome支持此方法)
alert(Object.getPrototypeOf(person1)==person.prototype); //true
alert(Object.getPrototypeOf(person1).name);
原型模式执行流程:
读取实例属性值:
1.先从对象实例开始搜索,有则返回该属性的值,没有继续根据链接搜索原型对象,最后返回原型中的属性值
2.不能通过对象实例重写原型中的值,如果在实例中添加了一个与原型中具有相同名字的属性,那么就在实例中创建该属性,该属性会屏蔽原型中的属性(但不会修改原型中的属性值)
解除屏蔽:即使在实例中把属性设置为null 也只会在实例中设置这个属性,而不会恢复其指向原型的链接,可以使用delete 操作符完全删除这个实例属性,让我们重新访问原型中的属性。
function person(){}
='dujie',