JavaScript(2)——对象属性、原型与原型链

对象属性、原型与原型链

哈哈哈,我的第二篇博客哟,说的是对象属性、原型与原型链。可能这些只是某些小点串联起来的,逻辑性没有很强。所以会对文章的可读性和理解性带来一些困扰。不过,今天我又前进了那么一小步,为之后的学习又打下了那么一丢丢的基础,虽然理解的不是特别好,不过我还会理解第二次,第三次。恩。加油!

【对象】

对象中包含一系列的属性。这些属性都是无序的,每个属性都有一个字符串key和对应的value。

创建自定义对象的最简单方式就是创建一个object实例,然后再为它添加属性和方法。

属性类型:数据属性和访问属性。

数据属性:

configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性等。这个特性默认值为true。

enumerable:表示能否通过for-in循环返回特性。这个特性默认值为true。

writable:表示能否修改属性的值。这个特性默认值为true。

value:包含这个属性的数据值。读取属性值的时候,在这个位置读取,写入属性值的时候,把新值保存在这个位置。这个特性默认值为undefined。

要修改默认属性,必须使用Object.defineProperty()方法。

可以多次调用Object.defineProperty()方法修改同一个属性,但把configurable特性设置为false之后就会有限制了。

访问器属性:

访问器属性不包含数据值,他们包含一对getter和setter函数(非必需)。getter函数负责返回有效的值;setter函数负责如何处理数据。

访问器属性一共有四个特性,除了configurable和enumerable之外,还有get和set方法,get在读取属性时被调用,set在写入属性时被调用。且默认值都为undefined。

在不支持Object.defineProperty()方法的浏览器中不能修改configurable和enumerable。

【原型与原型链】

原型模式:我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象包含可以由特定类型的所有实例共享属性和方法,而使用原型对象,可以让所有对象实例共享它所包含的属性和方法。字面理解的话,prototype就是通过调用构造函数而创建那个对象实例的原型对象。

原型对象:无论什么时候,只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向原型对象。在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。

使用hasOwnProperty()方法可以检测一个属性是存在于实例中还是存在于原型中。原型返回false,实例返回true。

原型与in操作符:in操作符可以单独使用,也可以在for-in循环中使用,而且同时使用in操作符和hasOwnProperty()就可以确定属性到底存在于对象还是原型中。如:

function Person(){}

Person.prototype.name="smile";

Person.prototype.age=19;

Person.prototype.sayName=function(){

alert(this.name);

};

var person1=new Preson();

alert(person1.hasOwnProperty("name"));//false

alert("name" in person1); //true

只要in操作符返回true,hasOwnProperty()返回false,就可以确定属性是原型中的属性。

原型链:原型链是实现继承的主要方法。基本思想是利用原型让一个引用类型继承另一个引用类型的方法。对于构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包括一个指向构造函数的指针,而实例都包含一个指向对象内部的指针。假如我们让原型对象等于另一个类型实例,那么此时的原型对象包含一个指向另一个原型指针,相应的,另一个原型也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,如此层层递进,就构成了实例与原型的链条。这就是原型链的基本概念。而且,在原型链的末端一定是null。

在通过原型链实现继承的情况下,搜索过程就得沿着原型链继续向上。

所有引用类型默认都继承了Object,而这个继承是通过原型链来实现的。所有函数的默认原型都是Object的实例,因此默认原型都会包含一个内部指针,指向Object.prototype。

原型链的问题:

原型链中的包含引用类型值的原型属性会被所有实例共享,而这也是为什么要在构造函数中,而不是原型函数中定义属性的原因。在通过原型实现继承时,原型实际上会变成另一个类型的实例。于是,原先的属性也顺理成章的变成了现在的原型属性了。

在创建子类型的实例时,不能向超类型的构造函数中传递参数。

时间: 2024-08-07 16:46:31

JavaScript(2)——对象属性、原型与原型链的相关文章

JavaScript原生对象属性和方法详解——Array对象 转载

length 设置或返回 数组中元素的数目. 注意:设置 length 属性可改变数组的大小.如果设置的值比其当前值小,数组将被截断,其尾部的元素将丢失.如果设置的值比它的当前值大,数组将增大,新的元素被添加到数组的尾部,它们的值为 undefined.所以length不一定代表数组的元素个数. var arr = new Array(3) arr[0] = "John" arr[1] = "Andy" arr[2] = "Wendy" cons

JavaScript中对象属性的添加和删除

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 用.为对象添加属性 用关键字delete删除属性 用[]添加属性 和.的不同 r.name==r["name"]; r.

javascript --- 将共享属性迁移到原型中去

当我们用一个构造函数创建对象时,其属性就会被添加到this中去.并且被添加到this中的属性实际上不会随着实体发生改变,这时,我们这种做法显得会很没有效率.例如: function her(){ this.name = 'Anna'; } 这意味着每次我们new her()创建一个实例对象的时候都会生成一个全新的name属性,并在内存中拥有属于该属性自己的存储空间.而事实上,我们可以将name属性添加到原型上去,这样一来所有实例都可以共享这个name属性了: function her(){} h

【JS】JavaScript中对象的创建与原型模式

 ECMAScript中没有类的概念,因此它的对象与基于类的语言中的对象有所不同. 1.理解对象 创建对象最简单的方式是创建一个Object实例,再为它添加属性和方法,如下: <span style="font-family:SimSun;font-size:12px;">var people = new Object(); people.age = 20; people.sayAge = function(){ alert(this.age); };</span

转: JavaScript 获取对象属性和方法

一.获取对象属性和方法 Object.keys()for in 返回对象的可枚举属性和方法的名称数组. Object.getOwnPropertyNames() 返回的数组的所有属性(可枚举或不可枚举)直接找到给定对象. 1 // 创建一个对象的构造方法 2 function myObj(name, attr) { 3 this.name = name; 4 this.attr = attr; 5 6 this.sayHi = function () { 7 return 'hi everyon

javascript中对象属性的介绍

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> // 对象的属性是什么类型的? string // 如果对象的属性不是字符

JavaScript - document对象属性和方法

document对象的属性和方法 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>test10.html</title> <script type="text/javascript"> //document对象的属性 /*alert(document.referrer); a

JavaScript原生对象属性和方法详解——String对象

length length 属性可返回字符串中的字符数目. length 是根据字符串的UTF-16编码来获取长度的,空字符串长度为0.length 不可修改. charAt() charAt() 方法可返回指定位置的字符.注意,JavaScript 并没有一种有别于字符串类型的字符数据类型,所以返回的字符是长度为 1 的字符串. stringObject.charAt(index) 参数index是必需的.表示字符串中某个位置的数字,即字符在字符串中的下标.字符串中第一个字符的下标是 0.如果

浅析JavaScript访问对象属性和方法及区别

属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸.跳跃等. 在JavaScript中通常使用"."运算符来存取对象的属性的值.或者使用[]作为一个关联数组来存取对象的属性. 对象的属性和方法统称为对象的成员. 访问对象的属性 在JavaScript中,可以使用" . "和" [ ] "来访问对象的属性. 1. 使用" . "来访问对象属性 语法: objectNam

javascript window对象属性和方法

window对象 window对象表示一个浏览器窗口或一个框架.在客户端JavaScript中,window对象是全局对象,所有的表达式 都在当前的环境中计算.也就是说,要引用当前窗口根本不需要特殊的语法,可以把那个窗口的属性当作全局变量 来使用.例如,可以只写document,而不必写window.document. window对象属性 标红色的: 重要的 标黑色的: 正常不用  closed:   返回窗口是否已被关闭 defaultStatus:      设置或返回窗口状态栏中的默认文