原型是个很微妙的东西,很多人不是很理解,理解了原型对于研究其他js类的框架(比方Extjs)很有帮助.
下面我们开始讨论下原型,对于理解js中的原型概念十分重要。简单来说,一个原型类似其他语言中的一个类,它定义的属性且可以被此类产生的所有对象所共享。然后它又不像一个类,原型可以在运行时获得和改变。可以增加属性到原型上或者删除原型上已经存在的属性。所有的变化将立即影响由原型派生的对象。它是如何工作的呢? js是一种动态的语言,它不是在编译期间去搜索属性值,而是在执行请求期间去搜索属性值。例如,考虑一个基本的继承案例,A的原型继承自B的原型,a对象是由A的原型派生出的对象.如果对象a上的一个属性被请求,则js表现出如下搜索过程:
-
js首先检查a对象上是否存在此属性,如果没有搜索到,则进行第2部分搜索过程。
-
js访问A的原型检查是否有此属性,如果仍然没搜到,则进行第3部分搜索过程。
3. js最后访问B的原型检查是否有此属性.如果没有搜到将访问每个对象上的原型直到达到根原型上。这样的一个搜索过程称原型链。
如下图所示:
![](http://dl.iteye.com/upload/attachment/0071/2704/50944604-e2f9-3cd3-a682-4a518f22b088.jpg)
下面我来出一个js原型的题目:
- function F() { }
- F.prototype.someProperty = 'prototype property';
- var a = new F();
- alert(a.someProperty);
- a.someProperty = 'object property';
- alert(a.someProperty);
- a.someProperty = undefined;
- alert(a.someProperty);
- delete a.someProperty
- alert(a.someProperty);
1=》'prototype property'
2=》'object property'
3=》undefined
4=>'prototype property'
解析:第1个先搜索a对象上是否存在someProperty属性,发现没有,则搜索它的原型发现有someProperty属性 值返回。
第2个依然先搜索a对象上是否存在someProperty属性,发现有,返回。
分析第3个前说下 a.someProperty = undefined; 虽然赋值undefined但a对象上依然有someProperty属性。
所以 第3个依然先搜索a对象上是否存在someProperty属性,发现有,返回
所以 第4个依然先搜索a对象上是否存在someProperty属性,由于delete a.someProperty此操作已经删除了a对象上的someProperty属性, 所以搜索它的原型发现有,返回。
到此大家应该对原型有一个比较清楚的认识。
js中创建对象方式一般如下:
function f(){
}
js每次声明新函数的过程中,都会为其创建一个 prototype 的属性。在未加其他附带条件情况下,所有函数的 prototype 属性有一个 constructor 属性,constructor 包含一个指向 prototype 属性所属函数的指针(就是说 constructor 回指构造函数本身),这表明alert(f.prototype.constructor ==f)结果为true。
分析图如下:
![](http://dl.iteye.com/upload/attachment/0071/2706/9dbfd1e2-1425-32c8-a612-98fb1d3f0776.jpg)
下面讲讲2个写法的区别:
方式1:function f(){
this.name="xxx"
}
方式2:function f(){
}
f.prototype.name="xxx";
对于以上2种方式定义,如果var f1 = new f() 虽然alert(f1.name)效果一样,但是对于方式1,有f产生的对象每个上面都有name属性,即每个对象都有一份内存使用,如果函数f内定义的属性更多那么占用的内存可想而知非常大;对于方式2,有f产生的对象每个上面都没有name属性,搜索属性时会按照上文搜索过程最终找到"xxx";所以方式2更加优化。
对于上文如果大家都能理解,我们趁热打铁,说下js的继承。
下面是一种实现js继承的方式
function father(){
}
function sun(){
}
sun.prototype=new father();//这样子类产生的对象都会有父类中的属性,按照之前的原型查找机制很容易理解
sun.prototype.constructor=sun();//由于上一句造成子类的构造函数变成父类的所以子类的构造函数还需还原回来
这样就完成了继承。当然通过前文的分析,此写法还有点缺陷,在内存上不是很优化。
其实可以使用一个空函数作为中介实现更优化的继承。此写法可以参考Extjs2,3版本中继承中的写法。
转载自:http://babydeed.iteye.com/
分享到:
相关推荐
JavaScript是Web开发中不可或缺的一部分,尤其在前端领域,它的强大在于动态性和灵活性。在这个"基于js原型链的小游戏"中,我们...这不仅是一个理解JavaScript原型链的好例子,也是实践前端开发技能的绝佳实践项目。
深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系
### JavaScript原型与原型链详解 JavaScript作为一门基于原型的语言,其原型和原型链的概念是理解和掌握JS继承机制的关键。接下来将详细阐述这些概念。 #### 普通对象与函数对象 在JavaScript中,一切皆为对象,...
在JavaScript的世界里,原型对象(Prototype)是理解对象继承机制的关键。这个练习旨在帮助学习者深入理解原型链的概念,这是JavaScript实现面向对象编程的核心部分。原生JS,即不依赖于像jQuery这样的库,让我们...
JavaScript原型链是JavaScript语言中的一个核心特性,它关乎对象之间的继承关系。在JavaScript中,一切皆为对象,而原型链则是实现对象间属性和方法共享的一种机制。理解原型链对于深入学习JavaScript至关重要。 ...
JavaScript原型通用验证框架是一种基于JavaScript设计模式的高效验证工具,其核心原理是利用JavaScript的原型(prototype)特性来实现对象的扩展与复用,从而达到代码的模块化和可维护性。这一框架广泛应用于Web开发...
该代码为JavaScript中关于原型对象的描述
JavaSciptDOM基本操作,JavaScipt函数基础,JavaScipt流程语句,JavaScript变量,JavaScript数据类型,JavaScript数组,JavaScript正则表达式,JavaScript字符串函数,Window对象等图解。JS高手进阶的工具图谱
彻底理解 JavaScript原型 原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有"[[prototype]]"属性,函数对象有"prototype"属性,原型对象有"constructor"属性。 为了弄清原型,以及原型相关的...
JS原型和原型链是JavaScript语言中的核心概念,它们构成了JavaScript对象继承的基础。在JavaScript中,对象可以通过原型链实现对其他对象的属性和方法的继承。下面我们将详细讲解这两个概念以及它们的工作原理。 **...
本文将深入探讨JavaScript原型链的工作原理及其可能导致的安全问题——原型链污染。 首先,JavaScript 中的对象继承并不像传统面向对象语言那样基于类,而是通过原型链机制。每个对象都有一个内部属性`[[Prototype]...
JavaScript原型和闭包是这门语言中两个比较难以理解且与其他面向对象语言区别较大的概念。理解这两个概念,不仅能让我们更深层次地理解JavaScript,而且有助于我们了解编程语言的设计思路,拓宽我们的视野。 首先,...
"Toastjs一个JavaScript原型吐司消息" 这个标题指的是一个名为Toast.js的JavaScript库,它主要用于实现"吐司"(Toast)消息功能。在UI设计中,吐司消息是一种轻量级的通知方式,通常用于显示短暂、非中断性的提示...
javascript原型继承,prototype的使用,可以像java一样继承
"基于Javascript原型的Zepto框架设计" 本文主要讨论了基于Javascript原型的Zepto框架设计。随着互联网的普及,前端技术也得到了迅速发展。为了深入了解前端开发中的框架设计原理,以Zepto前端框架为例,利用...
### JS原型的个人理解 #### 引言 在JavaScript中,原型(Prototype)是一个非常核心的概念,它决定了对象之间的继承关系以及属性查找机制。本文将深入探讨JS原型的基本原理、实现方式及其应用,并通过具体示例帮助...
### 浅析JavaScript原型继承机制 #### 一、引言 JavaScript作为一种动态语言,其对象模型与传统的面向对象编程语言有所不同。在JavaScript中,并没有直接提供类的概念,而是通过原型来实现继承。本文将深入探讨...
JavaScript原型链是JavaScript实现继承和共享属性的一种机制。在JavaScript中,每个对象都有一个内部属性`[[proto]]`,这个属性通常通过`__proto__`访问,它指向创建该对象的函数的`prototype`属性。原型链的主要...
### JavaScript原型继承工作原理及实例详解 #### 一、引言 JavaScript作为一种广泛使用的脚本语言,在Web开发中扮演着重要角色。其独特的面向对象机制是通过原型继承来实现的,这种机制使得JavaScript能够灵活地...
下面将详细阐述JavaScript原型链、构造函数以及继承的工作原理。 首先,让我们理解`function`构造函数。在JavaScript中,函数也是一种对象,它们拥有对象的所有特性。当我们定义一个函数如`function A() {}`时,JS...