JavaScript 笔记 ( Prototype )
这阵子实在好忙 ( 这样说好像也不是一两个月了... ),然后因为工作伙伴都是 JavaScript 神之等级的工程师,从中也学到不少知识,毕竟就是要和强者工作才会成长呀!为了想好好瞭解他们写的程式码,所以就只好深入来理解一下 JavaScript 里头 Prototype 这个恼人的「原型」,在两年前我有去上保哥 ( http://blog.miniasp.com/ ) 的 JavaScript,以自己当年的程度,加上工作上没有真正的实战机会,真的是听完就忘了,随著年纪增长,现在回头再来看才发现真是满有趣的,打铁趁热趁著搞懂了,赶快做个笔记。
JavaScript 裡面所有物件都具有 Prototype 这个原型物件,但只有函式物件才有公开的原型物件,其他的物件都只有私有的原型物件,凡是原型物件裡面的属性或方法,都会直接继承到它的实体物件上头,这实在是讲得很绕口,白话一点来说,就是我们每个人都具备「人类」这个 Prototype,而「人类」这个原型,具备了「用双脚行走」、「可以用嘴讲话」...等行为 ( 也就是方法 Method ),但对于每个人来说,各自有各自的属性,例如「姓名」、「肤色」...等,这大概就是物件与其 Prototype 的关系。
好像比较理解了,现在就直接用程式码来看看:
/* 一开始我们先定义一个函式物件 people,也就是如果一个人诞生的时候, 他会有「名字 name」的属性和「皮肤 skin」的属性。 */
function people(n,s){ this.name = n; this.skin = s; }
/* 接著我们来定义 human 这个原型物件,因为 people 是人类 human, 所以人类会具备 walk 走路、eat 吃东西和 scratch 抓痒这些行为, 这些人类开始这些行为的时候,我们用 console 给印出来。 */
var human = { walk : function(){ console.log(this.name + ' 在走路'); }, eat : function(){ console.log(this.name + ' 在吃东西'); }, scratch : function(){ console.log(this.name + ' 抓自己的' + this.skin + '皮肤'); } };
/* 然后我们把 human 这个原型物件绑定到 people 上头, 这里使用目前标准的写法 Object.create。 */
people.prototype = Object.create(human);
/* 最后我们开始生小孩了,首先生出一个 tom ( 使用 new people 很贴切 ), 名字叫做 Tom,皮肤是白色的,另外一个小孩叫做 Bill,皮肤是黑色的,Cherry 皮肤是黄色的。 */
var tom = new people('Tom','白色'); var bill = new people('Bill','黑色'); var cherry = new people('Cherry','黄色');
/* 生小孩之后,小孩长大了,Tom 开始走路,Bill 抓痒,Cherry 在吃东西。 */
tom.walk(); bill.scratch(); cherry.eat();
/* 所以执行起来结果就是: > Tom 在走路 > Bill 抓自己的黑色皮肤 > Cherry 在吃东西 */ 完整程式码:javascript-prototype-demo01.html
使用 Prototype 的好处,最主要就是可以定义一些共用的方法,而这些定义在记忆体当中也只会存一份,因为当我们每次 new 一个物件的时候,物件裡所有的属性都会被 new 一份出来,但原型继承就不会,因为是「继承」的概念,所以就是大家共用一份 ( 不会说我和你都是人类,但是你我的行为却大不相同,就像不会有人用屁股吃饭用嘴巴拉屎 XD )
当然,当一个物件 new 出来之后,就可以自己添加自己的属性,就像每个人的发展际遇、学历、兴趣都不同,这些就是看物件各自的属性去做添加设定。
最后来写一个可以用按钮控制区域颜色的 API 吧!这里我做一个 box,box 的原型是 boxDiv,boxDiv 具备了变红色、变蓝色、变大和变小四种方法,而 box 本身有一个属性 name,这个 name 就是读取有这个 id 的 div。( 完整程式码:javascript-prototype-demo02.html )
function box(n){ this.name = document.getElementById(n); }
var boxDiv = { red : function(){ this.name.style.background = '#f00'; }, blue : function(){ http://www.90168.org/ this.name.style.background = '#00f'; }, big : function(){ this.name.style.width = '100px'; this.name.style.height = '100px'; }, small : function(){ this.name.style.width = '20px'; this.name.style.height = '20px'; } };
box.prototype = Object.create(boxDiv);
var b = new box('area');
document.getElementById('r').addEventListener('click',function(){ b.red(); }); document.getElementById('b').addEventListener('click',function(){ b.blue(); }); document.getElementById('big').addEventListener('click',function(){ b.big(); }); document.getElementById('small').addEventListener('click',function(){ b.small(); });
以上就是我理解 Prototype 的一些心得,用人类的角度去思考,就会变得很容易理解了 :D
JavaScript 笔记 ( Prototype )的更多相关文章
- JavaScript笔记基础篇(二)
基础篇主要是总结一些工作中遇到的技术问题是如何解决的,应为本人属于刚入行阶段技术并非大神如果笔记中有哪些错误,或者自己的一些想法希望大家多多交流互相学习. 1.ToFixed()函数 今天在做Birt ...
- [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象
js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...
- javascript 之 prototype 浅析
prototype 原型 javascript 是一种 prototype based programming 的语言, 而与我们通常的 class based programming 有很大 的区别 ...
- Javascript: 从prototype漫谈到继承(2)
本文同时也发表在我另一篇独立博客 <Javascript: 从prototype漫谈到继承(2)>(管理员请注意!这两个都是我自己的原创博客!不要踢出首页!不是转载!已经误会三次了!) 上 ...
- [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符
“1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...
- [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...
- Javascript Array.prototype.some()
当我们使用数组时,查找数组中包含某个特殊的项是非常常见的动作.下面例子是一个简单的实现: 01 planets = [ 02 "mercury", 03 " ...
随机推荐
- HTML标签汇总
标签 描述 DTD(Document Type Definition) <!-- --> 定义html注释 STF <a> 定义链接或者锚点 STF <abbr> ...
- iOS应用架构谈(二):View层的组织和调用方案(中)
iOS客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答iOS应用架构中的种种问题,本文是其中的第二篇,主要讲View层的组织和调用方案.中篇主要讨论MVC.MVCS. ...
- iOS 动态计算文本内容的高度
关于ios 下动态计算文本内容的高度,经过查阅和网上搜素,现在看到的有以下几种方法: 1. // 获取字符串的大小 ios6 - (CGSize)getStringRect_:(NSString* ...
- 忘记Mysql登录密码
1,使用安全模式跳过验证: 如果 Mysql在运行,Kill掉. 如果mysqld_safe无法启动,可用管理员权限sudo . 2,本地登录: 启动Mysql 3,修改密码: 5.7之后, 更改密码 ...
- limits.h头文件
CHAR,SHRT,INT ,LLONG加_MAX后缀表示最大,加_MIN后缀表示最小,加U前缀表示无符号 UCHAR_MIN ,UCHAR_MAX sizeof()计算数所用的空间 #include ...
- C++动态数组
一: 一维数组初始化 标准方式1:int value[100]; //value[i]的值不定,因为没有初始化:标准方式2:int value[100] = {1,2,3}; //value[0],v ...
- SAE云平台上传图片和发送邮件
1.远程图片保存至Storage 其中public是Storage中的容器名,"目录1/目录2/"是容器下的路径 $file_content 是得到的文件数据 $s = new S ...
- C#4.0图解教程 - 第24章 反射和特性 - 1.反射
24.1 元数据和反射 有关程序及类型的数据被成为 元数据.他们保存在程序集中. 程序运行时,可以查看其他程序集或其本身的元数据.一个运行的程序查看本身元数据或其他程序的元数据的行为叫做 反射. 24 ...
- 知乎大牛的关于JS解答
很多疑惑一扫而空.... http://www.zhihu.com/question/35905242?sort=created JS的单线程,浏览器的多进程,与CPU,OS的对位. 互联网移动的起起 ...
- OCJP(1Z0-851) 模拟题分析(二)over
Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有 ...