接上一节的创建对象的模式:

原型模式:

  对于prototype的理解:我们创建的函数都有一个prototype(原型)属性,这个属性是一个指针指向一个对象,而这个对象的用途是包含基于这个方法的

所有的实例的共享属性和方法。并且每个原型对象都会默认的自动获取一个constructor(构造函数)的属性。这个属性包含一个执行这个prototype属性所在函数的指针。

function Person(){

}
Person.prototype.name = 'kim';
Person.prototype.age = 10;
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName();
var person2 = new Person();
person2.sayName();

  当我们在实例中定义一个和prototype中已有属性重名的属性的时候,该属性会屏蔽掉prototype中的这个属性。而不会修改prototype中的这个属性。

    person1.name = 'tom';

    alert(person1.name);//tom而不是kim

如果我们在这种情况下依然放问到prototype中的属性,我们可以使用delete操作符来删除实例中的这个属性。

  检测属性在实例中还是原型中的方法有:person2.hasOwnPrototype('name');//false只会在当属性是在实例中定义了才会返回true。

  in:操作符:无论属性是在prototype还是实例中,只要这个实例具有这个属性就会返回true;

    alert('name' in person2);//true

    person2.name = 'jimmie';

    alert('name' in person2);//true

    delete person2.name;

    alert('name' in person2);//true

  ---------综合上面的两种方法就可以确定一个属性到底是在实例中还是原型中

    function hasPrototypeProperty(object, name){

      return !object.hasOwnPrototype(name) &&(name in object);//true-->在原型中;false-->在实例中

    }

  Object.keys(对象实例);返回可枚举的属性Object.getOwnPrototypeNames(Person.prototype);//属性不论是否可枚举都会返回。这两个方法都可以替代

for-in来确定属性是否可以被实例方法到。

  我们每次在用实例访问属性的时候都会逐个在实例和prototype中查找这个属性,访问顺序是先在实例中查找指定的属性如果找到就会直接返回(所以当实例中

定义了和prototype中相同的属性和方法的时候,实例中的属性就会阻断与prototype中属性的访问)然后才逐个访问prototype中的属性(所以当我们在prototype

中更新了或者新建了一个属性,当实例访问时就可以立即放问到)       但是当我们重写了这个实例的原型就会出现意想不到的结果:

function Person(){
}
var person1 = new Person();
Person.prototype={
name: 'tom',
sayName: function(){
alert(this.name);
}
};
person1.sayName();//出现错误

  当我们调用构造函数初始化一个实例的时候,会自动的产生一个指针([[Prototype]]),而这个指针指向的最初的原型,而后来我们把原型对象彻底重写以后,就相当于

切断了构造函数与最初原型之间的联系。所以必须要记住:实例中的指针指向的是原型对象,而不是构造函数

  原型模式最主要的缺点:创建的所有的属性和方法都是所有实例所共享的。所以当我们需要一些每个实例都具有的特定的属性和方法的时候,原型模式就不是太合适了。

javascript 高级程序设计 十一的更多相关文章

  1. 《JavaScript高级程序设计(第3版)》笔记-序

    很少看书,不喜欢看书,主要是上学时总坐不住,没有多大定性,一本书可以两天看完,随便翻翻,也可以丢在角落里几个月不去动一下. 上次碰到了<JavaScript高级程序设计(第3版)>感觉真的 ...

  2. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

  3. 【javascript学习——《javascript高级程序设计》笔记】DOM操作

    DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘了一个层次节点树,允许开发人员添加.移除和修改. 1.节点层次 <html> <head& ...

  4. 读javascript高级程序设计00-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  5. 《JavaScript高级程序设计》读书笔记--前言

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

  6. 阅读摘录《javascript 高级程序设计》01

    前言: 因为工作需要,所以开始主攻前台JS方面的技术.在以前的工作中,使用过这门脚本语言.但是都是比较凌乱的,用到什么学什么,只是为了实现业务,而去使用. 不会考虑到代码优化,封装对象等.今次特意借了 ...

  7. 《JavaScript高级程序设计》学习笔记(5)——面向对象编程

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...

  8. 《JavaScript高级程序设计》学习笔记(4)——引用类型

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第五章内容. 在ECMAScript中, ...

  9. 《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第四章内容. 1.函数:通过函数可以封装 ...

随机推荐

  1. css3选择器补充

    一.关系选择器 1.E+F   (E元素下一个满足条件的兄弟元素节点) <style> div + p{ background-color:red;// 第一个p元素变色 } </s ...

  2. 使用RestTemplate调用接口上传文件

    场景 接口接受一个文件,缓存在本地,验证文件的完整性及内容,然后将文件上传至云服务器: 下面只写利用RestTemplate将文件上传至云服务器,至于文件上传以及缓存在本地可以参考:JAVA文件上传: ...

  3. js高级-模块化演变

    function demo(){ var a = b = c = 9; // b,c全局变量 a局部变量 } demo(); console.log(b) 命名空间 var Shop = {} //顶 ...

  4. KADEMLIA算法学习

    在上一篇文章中<P2P技术是什么>,我们介绍了P2P技术的特点以及发展历史.在本篇文章中,我们来介绍某一个具体的算法. 如今很多P2P网络的实现都采用DHT的方式实现查找,其中Kademl ...

  5. SpringBoot点滴(1)

    spring boot 注意事项 1.项目启动的主类,放置位置在所有类的外层与controller,dao,service,util,entity同层,SpringBoot会自动扫描@SpringBo ...

  6. SOA 是什么

    SOA 英文:Service-Oriented Architecture,面向服务的架构. 是一种面向通用集成服务的.松耦合的架构实现方式,是web时代服务发展的产物: 使用"分层" ...

  7. cdh5.13.1 升/降级SPARK2 (parcel安装的同理)

    下载相关的CSD包与parcel包.parcel包SHA 放置在相关位置. 注意:重启cloudera-scm-server 从parcel 里删除旧包,启用新包 csd目录里其它JAR包要删除

  8. windows2008 r2 不能启用网络发现解决方法

    1.出现的问题: 在“网络和共享中心”-“网络发现”不论如何,“启用”网络发现功能,系统都会自动重置为关闭状态. 2.解决方法: 运行中输入 services.msc-->在里边找到下边上个服务 ...

  9. white-space和word-wrap和word-break所表示的换行和不换行的区别

    一.前言 使得文本换行有很多方式, <br/>标签元素,能够强制使得所在位置文本换行 <p>元素,<div>设定宽度,都可以对文本内容实现自适应换行 对于长单词或者 ...

  10. SDK和API

    软件开发工具包(缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. 笔记:开 ...