夺命雷公狗---javascript NO:28 原型链

1、原型对象

在JavaScript中,每个构造器在加载后都会自动生成一个对象,我们把这个对象就称之为原型对象。

2、构造器与原型对象的关系

Person构造器与Person原型对象在内存中表现为相互独立,互不影响。但是在Person构造器中存在一个prototype属性指向Person原型对象,同时在Person原型对象中也存在一个属性指向Person构造器。

3、原型对象的作用

当我们在Person构造器的实例对象中引用一个不存在的属性或方法,系统会自动到Person构造器的原型对象中去寻找该属性。

4、如何证明prototype与constructor属性是互相指向关系

<!DOCTYPE html>
<html>
<head>
<meta charset=’utf-8′>
<title></title>
</head>
<body>
<script>
//定义一个Preson构造器
function Preson(){}
//通过person构造器实例化p1对象
var p1 = new Preson();
alert(p1.constructor.prototype.constructor.prototype.constructor);
</script>
</body>
</html>

5、原型对象的实际应用

在实际项目开发中,我们经常会使用别人编写的一些现成的框架或对象,如果我们发现其不存在某些属性,那么如何解决呢?

答:可以使用原型对象扩展属性

1)为原型对象添加属性

示例代码:

<!DOCTYPE html>
<html>
<head>
<meta charset=’utf-8′>
<title></title>
</head>
<body>
<script>
//定义一个Preson构造器
function Preson(){}
//通过person构造器实例化p1对象
var p1 = new Preson();
p1.name = ‘lisi‘;
p1.age = 22;
Preson.prototype.email = ‘[email protected]‘;
alert(p1.email);  //p1对象访问了一个不存在的email属性
</script>
</body>
</html>

2)为原型对象添加成员方法

<!DOCTYPE html>
<html>
<head>
<meta charset=’utf-8′>
<title></title>
</head>
<body>
<script>
//定义一个Preson构造器
function Person(){}
//通过person构造器实例化p1对象
var p1 = new Person();
p1.name = ‘lisi‘;
p1.age = 22;
//为Person原型对象定义speak成员方法
Person.prototype.speak = function(){
alert(this.name+’—-‘+this.age);
}
p1.speak();  //调用p1对象的不存在的speak成员方法
</script>
</body>
</html>

6、探究原型对象从何而来

原型对象在创建过程中,会自动执行以下代码:

构造器.prototype = new Object();

说明:当我们通过Person构造器的实例化对象p1访问一个不存在的属性或方法时,系统会自动到Person构造器的原型对象中去寻找,又由于所有的原型对象都是Object类的实例,原型对象会自动继承Object类中的所有属性和方法,我们可以得出结论:

p1对象会自动继承Object构造器中的所有属性和方法。

p1.属性à原型对象.属性 = new Object();所以可以得出

p1对象会自动继承Object构造器中的所有属性和方法。

我们把这种继承关系就称之为:原型继承

证明:

<!DOCTYPE html>
<html>
<head>
<meta charset=’utf-8′>
<title></title>
</head>
<body>
<script>
//定义一个Preson构造器
function Person(){}
//通过person构造器实例化p1对象
var p1 = new Person();
p1.name = ‘lisi‘;
p1.age = 22;
alert(p1.hasOwnProperty(‘name’));
</script>
</body>
</html>

7、原型链

当我们访问一个不存在的属性或方法时,系统会向上一级构造器的原型对象中去寻找,如找不到,则继续向上一级原型对象中去寻找,我们把这种链式查询关系,就称之为原型链。

证明:

<!DOCTYPE html>
<html>
<head>
<meta charset=’utf-8′>
<title></title>
</head>
<body>
<script>
//定义一个Preson构造器
function Person(){}
//通过person构造器实例化p1对象
var p1 = new Person();
p1.name = ‘lisi‘;
//为person原型对象定义一个age属性
Person.prototype.age = 23;
//为obj原型对象定义一个email属性
Object.prototype.email = ‘[email protected]‘;
alert(p1.age);
alert(p1.email);
</script>
</body>
</html>
时间: 2024-08-10 15:03:58

夺命雷公狗---javascript NO:28 原型链的相关文章

夺命雷公狗---javascript NO:21 自定义类1

1.快速入门 例1:通过原生js与面向对象js定义一个人的信息 <!DOCTYPE html> <html> <head> <meta charset=’utf-8′> <title></title> </head> <body> <script> //通过js代码定义一个人的信息 var name = ‘lisi'; var age = ’30′; var marry = false; alert

夺命雷公狗---javascript NO:30 闭包

1.什么是闭包 所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 例1:运行一下代码,得出结论:在全局作用域没有办法直接引用局部变量 <!DOCTYPE html> <html> <head> <meta charset=’utf-8′> <title></title> </head> <body> <script> funct

夺命雷公狗---javascript NO:23 JavaScript中的this指针

1.自定义类中的this指针 在php中,我们在自定义类时,属性都是预定义在我们的自定义类中,而在JavaScript代码中,所有对象的属性和方法都是动态添加到对象中,那么可不可以让我们的自定义对象自动拥有类的属性和方法? 答:可以,通过this指针 例1:谁实例化自定义类,那么类中的this就指向谁 <!DOCTYPE html> <html> <head> <meta charset=’utf-8′> <title></title>

夺命雷公狗---javascript NO:31 私有属性

1.什么是私有属性 在JavaScript代码中,是没有public/protected/private等定义属性的关键词,但是我们可以通过模拟的方式来实现这个过程. 在JavaScript只有两种属性: 一种共有属性 一种私有属性 2.定义私有属性 在构造器内部,通过this定义的属性就是公有属性 在构造器内部,通过var定义的属性就是私有属性 <!DOCTYPE html> <html> <head> <meta charset=’utf-8′> <

夺命雷公狗---linux NO:28 linux下的挂载操作

linux 下的原理图如下所示: 那么我们首先在linux 服务器下插上u盘或者放入光驱??模拟一下: 完成后即可回到linux使用mount命令进行挂载操作了,如下所示: 这样就完成了挂载操作了... 让后我们去看看这里面的内容和我们刚才挂载的 .iso文件  里面的内容是一模一样的噢,如下所示: 然后我们在linux系统里进入到挂载到的光驱的   Packages   目录下,如下所示: 回车后既可以发现里面有几千个文件解压包,如下所示: 这里面都是linux的应用程序包..... 居然有挂

夺命雷公狗---javascript NO:16 默认行为1

1.什么是默认行为 在我们的HTML标签中,很多标签拥有自己的默认行为. 如: submit提交按钮:其会自动提交表单数据到处理页面 a标签:其会自动跳转到指定页面 有些情况下,我们并不需要这种默认行为. 如: 当我们未填写表单数据时,系统不应该直接提交表单数据到处理页面. 当我们单击删除链接时,如果用户没有确认是不应该直接跳转删除的. 2.组织默认行为 IE模型浏览器 window.event.returnValue = false; W3C模型浏览器 dom对象.事件 = function(

夺命雷公狗---javascript NO:17 默认行为2

解决兼容性问题 ① 在public.js中创建prevent函数 ② 判断浏览器类型 ③ 编写一下程序代码 //解决阻止默认行为兼容性问题 function prevent(event){ if(window.event){ //IE模型浏览器 window.event.returnValue = false; }else{ //w3c event.preventDefault(); } } ④ 在html页面测试prevent方法 <!DOCTYPE html> <html> &

夺命雷公狗---javascript NO:15 事件冒泡3

解决事件冒泡兼容性问题 ① 在public.js函数库中创建stopBubble函数 ② 判断浏览器类型 //冒泡兼容性问题 function stopBubble(event){ if(window.event){ //IE window.event.cancelBubble = true; }else{ event.stopPropagation(); } } ③ 在html页面测试stopBubble函数 <!DOCTYPE html> <html> <head>

夺命雷公狗---javascript NO:32 Call/Apply方法

行内绑定中this指向:全局window对象 动态绑定中this指向:当前要操作的dom对象 构造器中的this指向:谁实例化构造器那么其内部的this就指向谁 1.为什么需要Call与Apply方法 问题:我们可以不可以手工改变函数内部的this指向?答:可以,使用Call或Apply方法 2.如何定义Call与Apply方法 call([thisObj[,arg1[,arg2[,argN]]]]) 参数说明: 函数.call(thisObj,arg1,arg2,arg3…) thisObj