这阵子实在好忙 ( 这样说好像也不是一两个月了... ),然后因为工作伙伴都是 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. The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

    出现这样的错误: error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your C ...

  2. Android笔记:四大组件

    1.Activity(是用户可以看到的主要的界面,使用时需要在AndroidManifest.xml中编辑声明.) 启动模式: 启动模式一共有四种,分别是standard.singleTop.sing ...

  3. 25个增强iOS应用程序性能的提示和技巧(中级篇)(2)

    25个增强iOS应用程序性能的提示和技巧(中级篇)(2) 2013-04-16 14:42 破船之家 beyondvincent 字号:T | T 本文收集了25个关于可以提升程序性能的提示和技巧,分 ...

  4. Ubuntu之MaxScale安装配置

    原文github:https://github.com/mariadb-corporation/MaxScale/blob/develop/Documentation/Documentation-Co ...

  5. 关于s:iterator 和s:if 的结合使用

    <s:iterator value="list" status="st"> <div class="sidebar-nav" ...

  6. python 连接sql server

    linux 下pymssql模块的安装 所需压缩包:pymssql-2.1.0.tar.bz2freetds-patched.tar.gz 安装: tar -xvf pymssql-2.1.0.tar ...

  7. ASP.NET的新成员ASP.NET WebHooks

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:前几天微软除了发布了ASP.NET 5的Beta7之外,还有一个值得关注的东西,就是A ...

  8. 用.NET开发通用Windows App

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:随着Windows 10的正式发布,作为.NET开发人员应该开始或多或少了解一下通用( ...

  9. long和int的区别

    转自:http://blog.sina.com.cn/s/blog_6f62c9510101svjz.html 突然间就想到了long和int到底什么区别(发现有很多问题都是突然间想到的),然后百度. ...

  10. PMP 第十二章 项目采购管理

    1规划采购 2实施采购 3管理采购 4结束采购 1.合同的不同叫法?卖方的不同叫法? 2.规划采购管理的目的是什么?合同类型有哪些?不同的特点是什么?何种情况下应选择何种合同?自制或外购分析计算和合同 ...