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——原型的更多相关文章

  1. javascript中的对象,原型,原型链和面向对象

    一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...

  2. JS原型,Prototype,原型

    对于javascript这样一种前端语言,个人觉得,要真正的理解其oop, 就必须要彻底搞清楚javascript的对象,原型链,作用域,闭包,以及this所引用的对象等概念.这些对弄明白了,应该就可 ...

  3. JavaScript的面向对象原理之原型链详解

    一.引言 在16年的10月份,在校内双选会找前端实习的时候,hr问了一个问题:JavaScript的面向对象理解吗?我张口就说“JavaScript是基于原型的!”.然后就没什么好说的了,hr可能不知 ...

  4. js原型链继承及调用父类方法

    方法1: var Parent= function () { }; Parent.prototype.process = function(){ alert('parent method'); }; ...

  5. js-静态、原型、实例属性

    本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...

  6. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  7. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  8. Js 原型和原型链

    Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...

  9. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

随机推荐

  1. postgresql recovery.conf改变需要重启吗

    之前在研究pgpoll时,发现trigger_file参数指定的文件存在后,会自动将standby节点提升为可写节点.不需要手动执行pg_ctl promote,但是这个时间一般有延迟,因为进程会定期 ...

  2. 网站 安全 ---- 常见的 web 攻击

    网站 安全 ---- 常见的 web 攻击 1 sql 注入(常用的攻击性)(django的orm是做过sql防护处理的) 危害: 非法读取,篡改,删除数据库中的数据 盗取用户的各类敏感信息.获取利益 ...

  3. Qt中QT_BEGIN_NAMESPACE和QT_END_NAMESPACE的作用

    在Qt中,我们经常会看到 QT_BEGIN_NAMESPACE class QAction; class QMenu; class QPlainTextEdit; QT_END_NAMESPACE 这 ...

  4. React Native探索(四)Flexbox布局详解

    相关文章 React Native探索系列 前言 在Android开发中我们有很多种布局,比如LinearLayout和RelativeLayout,同样在React Native也有它的布局,这个布 ...

  5. 使用sqlmap执行SQL注入攻击

    sqlmap是开源的SQL注入自动攻击工具,它可以自动的探测SQL注入点并且进一步控制网站的数据库. Kali Linux默认安装了这个工具. 找到潜在的攻击目标 第一步是找到有SQL注入漏洞的网站. ...

  6. HihoCoder1127 二分图三·二分图最小点覆盖和最大独立集

    二分图三·二分图最小点覆盖和最大独立集 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上次安排完相亲之后又过了挺长时间,大家好像都差不多见过面了.不过相亲这个事不是说 ...

  7. HBase错误大全

    1. stopping hbasecat: /tmp/hbase-root-master.pid: No such file or directory 原因:hadoop的pid文件丢失,hadoop ...

  8. 洛谷 P1312 Mayan游戏

    题解:搜索+模拟 剪枝: 最优性剪枝:x从小到大,y从小到大,第一次搜到的就是字典序最小 的最优解. 最优性剪枝:把一个格子和左边格子交换,和左边格子和右边格 子交换是等价的,显然让左边格子和右边交换 ...

  9. 向HDFS中追加内容

    向生成好的hdfs文件中追加内容,但是线上使用的版本是1.0.3,查看官方文档发现,在1.0.4版本以后才支持文件append 以下是向hdfs中追加信息的操作方法 如果你只在某一个driver中追加 ...

  10. bzoj 4555 [Tjoi2016&Heoi2016]求和——NTT+第二类斯特林数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 第二类斯特林数展开式: \( S(i,j) = \frac{1}{j!} \sum\l ...