这阵子实在好忙 ( 这样说好像也不是一两个月了... ),然后因为工作伙伴都是 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 )的更多相关文章

  1. JavaScript笔记基础篇(二)

    基础篇主要是总结一些工作中遇到的技术问题是如何解决的,应为本人属于刚入行阶段技术并非大神如果笔记中有哪些错误,或者自己的一些想法希望大家多多交流互相学习. 1.ToFixed()函数 今天在做Birt ...

  2. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  3. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  4. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  5. javascript 之 prototype 浅析

    prototype 原型 javascript 是一种 prototype based programming 的语言, 而与我们通常的 class based programming 有很大 的区别 ...

  6. Javascript: 从prototype漫谈到继承(2)

    本文同时也发表在我另一篇独立博客 <Javascript: 从prototype漫谈到继承(2)>(管理员请注意!这两个都是我自己的原创博客!不要踢出首页!不是转载!已经误会三次了!) 上 ...

  7. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  8. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  9. Javascript Array.prototype.some()

    当我们使用数组时,查找数组中包含某个特殊的项是非常常见的动作.下面例子是一个简单的实现: 01 planets = [ 02     "mercury", 03     " ...

随机推荐

  1. VS2010编译Qt4.8.2的64版本库

    安装qt-win-opensource-4.8.2-vs2010.exe(从http://download.qt.io/archive/qt/4.8/4.8.2/下 载),这个是32位的,里面有编译好 ...

  2. UVa815_Flooded!

    #include <iostream> //#include <fstream> #include <iomanip> #include <cstdio> ...

  3. 有关Java的优秀博客集锦

    1. 在java编程中,多线程并发总有些疑惑:如为什么会产生并发?并发会有什么影响?java中提供了哪些处理并发的技术(机制) 关于并发产生的原因,我查了一些资料目前发现有两种原因:一,存在共享的资源 ...

  4. NYOJ题目816它合法吗?

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtIAAAJ0CAIAAACwTVMOAAAgAElEQVR4nO3du1LjzNo24O8kyDkQYh

  5. JQ AJAX

    用AJAX方法不刷新网页使用下拉列表连接数据库 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  6. 端口扫描之王-----------nmap

    [root@ok data]# nmap -F -sT -v nmap.org Starting Nmap 5.51 ( http://nmap.org ) at 2016-10-23 12:46 C ...

  7. linux中解决SSH连接慢问题 关键点GSSAPIAuthentication

    [root@ok 6FE5-D831]# ssh -v xxx.xxx.xxx.64 OpenSSH_5.3p1, OpenSSL Feb debug1: Reading configuration ...

  8. PHP中array_merge和array相加的区别分析

    今天处理一个这样的问题:如何获取字符键名相同值不同的两个数组值集合,用array_merge和数组相加都不可行,让我认真比较了下PHP中array_merge和array相加的区别 首先来看看键名是s ...

  9. Ubuntu中给eclipse和android studio添加桌面快捷图标

    Ubuntu 12.04 创建应用程序启动项(可在Unity LaucherPad显示) http://www.cnblogs.com/bluestorm/archive/2012/10/12/272 ...

  10. MSSQL数据的批量插入

    一.概述: 对于数据的批量插入操作似乎成了某些大数据量操作的必用手段,MSSQL也提供了一些数据批量插入的操作方法,先将这些方法汇总,以便于下次用到使用.面对数据的批量插入操作,我们也应该考虑一个问题 ...