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)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...
随机推荐
- Golang的接口
当一只鸟走路像鸭子,游泳像鸭子,叫起来也像鸭子,那么我们就认为它就是鸭子. Duck typing 的理念因此比喻得名. Golang 通过 interface 实现 duck typing. Eff ...
- jQuery 绑定事件总结
目前已知有: $("..").bind("事件名",fn); $("parent").on("事件名","se ...
- Ubuntu+Rmarkdown的中文slides实现(附GitHub template)
这两天要做毕业论文的答辩slides,搜Rmarkdown中文slides的时候百度到了自己两年前的博客 R+markdown+LaTeX 中文编译解决方案.讲真我一开始还真没有认出来,一看这文风和博 ...
- libQt5Core.so: undefined reference to `dlclose@GLIBC_2.4'
/******************************************************************************** * libQt5Core.so: u ...
- 自己搭建MVC时遇到的一些问题及解决办法
错误1 The view 'Index' or its master was not found or no view engine supports the searched locations. ...
- HDU - 6129 :Just do it (杨辉三角)
There is a nonnegative integer sequence a 1...n a1...n of length n n . HazelFan wants to do a type ...
- HihoCoder - 1615矩阵游戏II(贪心)
矩阵游戏II 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个NxN的整数矩阵,小Hi每次操作可以选择两列,将这两列中的所有数变成它的相反数. 小Hi可以进行任意 ...
- 剑指offer-第五章优化时间和空间效率(数组中的逆序对的总数)
题目:在数组中如果两个数字的前面的数比后面的数大,则称为一对逆序对.输入一个数组求出数组中逆序对的总数. 以空间换时间:思路:借助一个辅助数组,将原来的数组复制到该数组中.然后将该数组分成子数组,然后 ...
- Linux环境安装git
git配置 源码安装 检测当前git版本是否是2.7.4以上 git --version 如果没有安装git直接源码安装即可,如果安装了先删除原来的git. yum -y remove git 先安装 ...
- Spring aop 记录操作日志 Aspect 自定义注解
时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题 所需jar包 :spring4.3相关联以及a ...