javascipt——原型
1、原型存在的意义
JS不是面向对象的语言,没有类的概念,但是提供了构造器函数,其也可以创建一个对象。构造器函数如下:
function people(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.message = function () {
console.log("名字:" + this.name + ";年龄:" + this.age + ";性别:" + this.sex);
}
}
创建对象如下:
var long=new people("小龙",24,"男");
long.message();
var yu=new people("小玉",23,"女");
yu.message()
结果如图:

每一次new一个新的对象时,都会根据构造函数复制一份副本保存到内存中。由于一般来说不同对象其属性值是不同的,如上面的 name、age、sex。但是方法的内容确是相同的。现在每new一个对象就复制一次方法保存的内存中实在有些浪费内存。解决这个问题就要用到原型。
方法通过原型实现 如下:
function people(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
people.prototype=new function () //为构造函数重写原型。
{
this.message = function () {
console.log("名字:" + this.name + ";年龄:" + this.age + ";性别:" + this.sex);
}
}
创建对象如下:
var long=new people("小龙",24,"男");
long.message();
var yu=new people("小玉",23,"女");
yu.message()
结果如图:

可见最终实现的效果是一致的。
2、prototype 与 __proto__的区别(注意:__proto__ 的前后均是两个下划线)
首先要明确一点的是:原型是一个实例化的对象而不是构造函数。
要区分 prototype 与 __proto__首先要明确原型对象与构造函数、实例化对象之间的连接关系。
对于构造函数,我们是通过构造函数的prototype 属性连接的。如上的 构造函数的原型对象被我们重写。 prototype 属性指向一个新的对象。在使用构造函数创建对象时。除了将构造函数中我们自己定义的属性复制到新的对象,保存到内存中外,还会为新对象自动创建属性 __proto__ 。其值为构造函数的 prototype 属性值。
因此可以得出结论:prototype 与 __proto__类似于C语言的指针,均是指向了原型对象。
如图:

3、实例化对象与静态属性
每一个实例化对象均有属于自己的内存,通过构造函数定义的属性、方法均保存在该内存中,因此对于构造器函数中创建的属性在每一个实例之间是隔绝的;而原型也拥有自己专有的内存区域,每一个实例化对象均可以访问、修改的操作。因此可以将所有共用的属性直接放到原型对象中,这样就实现了类似C#中的静态属性的功能。
例:
var people = function () {
this.message = function () {
console.log("姓名:" + this.name + ";年龄:" + this.age + ";性别:" + this.sex)
}
this.setsex = function (sex) {
this.__proto__.sex = sex;
}
}
var man = function () {
this.sex = "男";
}
man.prototype = new people();
var man_people = function (name, age) {
this.name = name;
this.age = age;
}
man_people.prototype = new man()
var long = new man_people("小龙", 24);
var qiang = new man_people("小强", 23);
long.message();
qiang.message();
long.setsex("女"); //此处给他们做个变性手术
long.message();
qiang.message();
4、创建共用组件
待续:
参考:
http://www.cnblogs.com/yangjinjin/archive/2013/02/01/2889103.html;
http://www.cnblogs.com/charling/p/3597793.html;
http://www.cnblogs.com/onepixel/p/5024903.html;
http://www.cnblogs.com/ljchow/archive/2010/06/08/1753526.html;
http://www.cnblogs.com/wishyouhappy/p/3721778.html
javascipt——原型的更多相关文章
- javascript中的对象,原型,原型链和面向对象
一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...
- JS原型,Prototype,原型
对于javascript这样一种前端语言,个人觉得,要真正的理解其oop, 就必须要彻底搞清楚javascript的对象,原型链,作用域,闭包,以及this所引用的对象等概念.这些对弄明白了,应该就可 ...
- JavaScript的面向对象原理之原型链详解
一.引言 在16年的10月份,在校内双选会找前端实习的时候,hr问了一个问题:JavaScript的面向对象理解吗?我张口就说“JavaScript是基于原型的!”.然后就没什么好说的了,hr可能不知 ...
- js原型链继承及调用父类方法
方法1: var Parent= function () { }; Parent.prototype.process = function(){ alert('parent method'); }; ...
- js-静态、原型、实例属性
本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
- 简单粗暴地理解js原型链--js面向对象编程
原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...
- Js 原型和原型链
Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...
- javaScript的原型继承与多态性
1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...
随机推荐
- while for if ---语句和编写计划任务
关于while循环: while do done 例如 1.关于内存的实时操作: (1).vim a.sh (2).输入以下while循环 (3)../a.sh执行脚本 2.自加一的操作: (1).v ...
- Android开发调试中遇到的Waiting for HOME解决方案
显示问题如图: 基本解决思路:在AVD里面单独启动运行一次模拟器,然后尝试运行程序,基本会解决这个问题.
- (转)程序员应该知道的10个eclipse调试技巧
调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷.对于Java程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序.本文介绍了Java程序员必知的10个调试技巧, ...
- android手机尺寸相关p107-p110
1.ldpi-----240x320-----密度120 mdpi-----320x480-----密度160 hdpi-----480x800-----密度240 xhdpi-----720x128 ...
- tcp 服务端和客户端程序设计
一.实验目的 学习和掌握Linux下的TCP服务器基本原理和基本编程方法,体会TCP与UDP编程的不同,UDP编程:http://blog.csdn.net/yueguanghaidao/articl ...
- Arcgis for javascript不同的状态下自定义鼠标样式
俗话说:爱美之心,人皆有之.是的,没错,即使我只是一个做地图的,我也希望自己的地图看起来好看一点.在本文,给大家讲讲在Arcgis for javascript下如何自定义鼠标样式. 首先,说几个状态 ...
- Chrome设置允许ajax跨域
最近在做一个前后端分离的项目,在Windows上用.Net WebApi时候的后端,在Mac上用ng2搭建的前端. 要实现前后端对接进行调试,就必须要解决ajax跨域的问题,实现方法如下: //在te ...
- eclipse javaw.exe in your current path问题
问题: 第一次运行eclipse的时候,可能会提醒找不到javaw.exe ******等的问题 很坑的! 解决方案: 无法启动Eclipe,因找不到javaw.exe 还是环境变量的问题!!! 注意 ...
- HttpModule和HttpHandler -- 系列文章
ASP.NET 生命周期 在ASP.Net2.0中使用UrlRewritingNet实现链接重写 IHttpModule实现URL重写 使用IHttpHandler防盗链 HttpModule,Htt ...
- ORA-28595: Extproc 代理: DLL 路径无效解决办法
报错信息: ORA-28595: Extproc 代理: DLL 路径无效 ORA-06512: 在 "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 70 ...