JS对象与原型

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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',

相关文档
最新文档