JavaScript高级特性之原型

JavaScript的原型

原型prototype属性只适用于函数对象(这里的函数对象是自己为了理解更好定义的,普通对象是没有原型属性的)

1.研究函数原型:

<script type="text/javascript">
  	//原型是函数对象的一个属性(普通对象是没有原型属性的.).
	function Person(){
		this.name="李卫康";
		this.sayHi=function(){
			alert("Hi");
		}
	};
	//调用函数对象Hero的属性和方法:new Hero()
	var p=new Person();
	//调用函数对象Hero的属性或方法时,实际上调用new之后的hero对象.
	alert(p.name);
	//调用函数对象的原型属性,是应该调用Hero对象还是hero对象呢?
	alert(Person.prototype);

  </script>

javascript中没有类的概念,只有对象的概念.那么原型属性是定义在函数对象(相当于Java中的类)中,还是new的对象中呢.一般情况下我们研究是JavaScript的函数对象中的原型.

2.函数对象中增加属性和方法的方式(分散式和集中式)

定义函数对象:

function Person(){
		this.name="李卫康";
		this.sayMe=function(){
			alert("Hi");
		}
	}

(1)分散式定义属性和方法:

Person.prototype.value="是头猪";

Person.prototype.sayHi=function(){

alert("Hi");

}

通过new对象的方式测试:

var p=new Person();

alert(p.value);

p.sayHi();

(2).集中式为函数原型增加属性

Person.prototype={

value:"是猪";

sayHi:function(){alert("Hi");}

}

分散和集中式都可以为函数增加属性,但是我们推荐集中式的为函数增加属性

3.函数对象的属性或方法与原型的属性或方法同名时:

<script type="text/javascript">
  	//这表明了原型上的属性和方法加上去了但是优先级是函数对象上的属性和方法的优先级要高于函数对象的原型上的属性和方法的
  	/*
  	 * 函数对象的属性或方法与原型的属性或方法同名时:
  	 * 	* 调用的属性和方法,是函数对象的属性和方法
  	 * 	* 函数对象本身的属性和方法与原型的属性和方法同时存在
  	 * 	* 函数对象本身的属性和方法的优先级要高于原型上的熟悉感和方法
  	 */
	function Hero(){
		this.name = "李卫康";
		this.sayMe = function(){
			alert("我是李卫康.");
		}
	}

	//原型增加的属性和方法,到底有没有增加上去呢?
	Hero.prototype = {
		name : "周芷若",
		sayMe : function(){
			alert("我是周芷若.");
		}
	}

	var hero = new Hero();

	alert(hero.name);			//output	zhangwuji

	delete hero.name;

	alert(hero.name);			//output	zhouzhiruo

  </script>

测试:第一个打印的是李卫康.而不是周芷若.这说明函数原型中的属性和函数定义的重名的时候不会被覆盖..函数对象的是函数对象的 原型的是原型的....把函数对象中的属性删除后..我们在打印:周芷若...

4.利用原型重新定义函数对象:也就是说我们定义函数对象的时候定义一个空的,把所有的属性和方法定义在原型中.

<script type="text/javascript">
  	//定义一个空的函数
	function Person(){};
	//把属性和方法定义在函数原型上
	Person.prototype={
		name:"程崇树",
		seeAV:function(){
			alert("树哥喜欢蔡司!");
		}
	}
	var p=new Person();
	alert(p.name);
	p.seeAV();

  </script>

5.扩展内建对象的属性和方法(我们为Array对象增加了一个函数....)

<script type="text/javascript">
	Array.prototype.inArray=function(color){
		for(var i=0;i<Array.length;i++){
			if(this[i]=="red"){
				return true;
			}
		}
		return false;
	}
	var color=["red","blue"];
	alert(color.inArray("red"));

  </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-11 03:11:36

JavaScript高级特性之原型的相关文章

javascript高级特性

01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_对象_定义函数对象09_对象_内建对象10_原型_为函数对象增加属性或方法11_原型_利用函数对象本身重写原型12_继承_函数对象之间的继承13_继承_普通对象之间的继承 javascript高级特性(面向对象): * 面向对象:   * 面向对象和面向过程的区别:     * 面向对象:人就是对象,年龄\

javascript高级篇——理解原型和作用域【连载中...】

说明: 该教程绕开了javascript的一些基本的语法知识,直接讲解javascript中最难理解的两个部分,也是和其他主流面向对象语言区别最大的两个部分--原型和作用域,当然,肯定少不了原型链和作用域链.帮你揭开javascript最神秘的面纱. 为什么要偏偏要讲这两个知识点? 这是我在这么多年学习javascript的经历中,认为最难理解.最常犯错的地方,学习这两个知识点,会让你对javascript有更深层次的理解,至少理解了原型和作用域,就不能再算是javascript菜鸟了.另外,这

javascript高级特性之&quot;继承&quot;

javaScript中并不存在继承的感念..但是我们可以根据javaScript的原型进行模拟JavaScript的"继承": 1.写两个函数对象,将其中的一个函数赋值给另一个函数对象的原型: <script type="text/javascript"> function A(){ this.a = "a"; this.sayA = function(){ alert("this is a."); } } var

javascript高级知识点——函数原型

代码信息来自于http://ejohn.org/apps/learn/. 向函数的原型中添加方法 function Ninja(){} Ninja.prototype.swingSword = function(){ return true; }; var ninjaB = new Ninja(); console.log( ninjaB.swingSword(), "Method exists and is callable." ); 通过实例化对象可以访问,因为构造函数实例化的对象

JavaScript【5】高级特性(作用域、闭包、对象)

笔记来自<Node.js开发指南>BYVoid编著 1.作用域 if (true) { var somevar = 'value'; } console.log(somevar); JavaScript的作用域完全是由函数决定的,if.for语句中的花括号不是独立的作用域. 1.1.函数作用域 作用域是通过函数来定义的,在一个函数中定义的变量只对这个函数内部可见,我们称为函数作用域.在函数中引用一个变量时,JavaScript会先搜索当前函数作用域,或者称为"局部作用域",

《Javascript高级程序设计》阅读记录(二):第四章

这个系列之前文字地址:http://www.cnblogs.com/qixinbo/p/6984374.html 这个系列,我会把阅读<Javascript高级程序设计>之后,感觉讲的比较深入,而且实际使用价值较大的内容记录下来,并且注释上我的一些想法.做这个一方面是提升了我的阅读效果以及方便我以后阅读 另一个目的是,Javascript高级程序设计这本书内容很多也很厚,希望其他没有时间的人可以通过看这系列摘录,就可以大体学到书里面的核心内容. 绿色背景的内容是我认为比较值得注意的原著内容.

《JavaScript高级程序设计》学习笔记(5)——面向对象编程

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.前面提到过,ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或者函数.

JavaScript高级---装饰者模式设计

一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生产对象,实现解耦. 桥接模式 : (桥接模式是一种既能把两个对象连接在一起,又能避免二者间的强耦合的方法.通过“桥”把彼此联系起来,同时又允许他们各自独立变化) 主要作用:主要作用表现为将抽象与其实现隔离开来,以便二者独立化. 组合模式 : (组合模式是一种专门为创建Web上的动态用户界面而量身制定

JavaScript高级程序设计25.pdf

Text类型 文本类型由Text类型表示,包含纯文本内容,可以包含转义后的HTML字符,但不能包含HTML代码.Text节点具有以下特征: nodeType的值为3: nodeName的值为"#text": nodeValue的值为节点所包含的文本: parentNode是一个Element: 不支持(没有)子节点 可以通过nodeValue属性或data属性访问Text节点中包含的文本,这两个属性中包含的值相同,对nodeValue的修改也会通过data反映出来.可以使用下列方法操作