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. 获取Activity的返回参数

    一.新建一个空的工程 二.在主界面中添加一个按钮和一个TextView组件 三.新建一个空的activity,命名为TheAty,并添加一个按钮和一个EditText组件 四.重写TheAty的源代码 ...

  2. c# unicode 编码 中文转换 已测试(转)

    中文传参时因为编码不同经常凌乱风中,故传前编成unicode码来过度是一个不错的解决方法 /// <summary> /// 中文转unicode        /// </summ ...

  3. java如何填写简历?(干货篇)

        化身孤岛的鲸不才 - 十三夜之月 一份优秀的简历不一定能帮你找到一份满意的工作,但能大大提升你的面试机会. 不容否认,简历是对你的能力.教育和经历的一份简要信息概述. 简历中应该突出你最核心的 ...

  4. linux rm删除含有特殊符号目录或者文件

    想要删除time$1.class,用rm time$1.class是不行的,可以用 rm time"$"1.class 删掉   假设Linux系统中有一个文件名叫“-polo”. ...

  5. Kali Linux破解wifi密码(WEP)

    WEP是无线路由器最初广泛使用的一种加密方式,这种加密方式非常容易被破解. 目前很少有人使用wep加密方式,但是还是会有. 建议:使用WPA/WPA2做为加密方式. 抓包和"破解wpa/wp ...

  6. 不得不注意tornado多进程部署的副作用

    tornado多进程启动时,采用的是fork的方式. 一个现有进程可以调用fork函数创建一个新进程.由fork创建的新进程被称为子进程(child process).fork函数被调用一次但返回两次 ...

  7. 缓存(Cache)管理 ---- 系列文章

    利用Cache防止同一帐号重复登录 .net中Cache管理操作 系统缓存全解析 (下) 系统缓存全解析 (中) 系统缓存全解析 (上) 出处:http://www.cnblogs.com/luckd ...

  8. ①SpringBoot入门教学篇

    一.什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  9. photoshop画矩形款

    1.屏幕截图 2.在photoshop新建图形 3.用矩形选框 4.右键打开描边,宽度设成5个像素

  10. xshell 使用密钥登录

    http://blog.csdn.net/suquan629/article/details/44783377