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

原型模式:

  对于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. 吴裕雄 python oracle子查询的用法(3)

    import cx_Oracle conn = cx_Oracle.connect("scott/admin@localhost:1521/orcl")cursor = conn. ...

  2. Jumpserver 文档

    http://docs.jumpserver.org/zh/docs/admin_guide.html

  3. Pandas数据存取

    pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA']) Pandas数据存取 Pandas可以存取多种介质类型数据, ...

  4. MVC 中Controller返回值类型ActionResult

    下面列举Asp.net MVC中Controller中的ActionResult返回类型 1.返回ViewResult视图结果,将视图呈现给网页 public ActionResult About() ...

  5. python基础学习 Day19 面向对象的三大特性之多态、封装

    一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...

  6. Python算法(一)冒泡排序

    3 5 1 6 2 1)第一次:找到这些数中最大的一个,并把它放最后. 3.5找到大的数放到第二个位置 5.1找到大的数放到第三个位置 5.6找到大的数放到第四个位置 2.6找到大的数放大第五个位置 ...

  7. 2017面向对象程序设计(JAVA)课程总结

    以下就课程结束之后的问题进行简单小结:1. 关于课程教学方法       课程在部分章节的学习中采用了翻转课堂教学,目的是促进同学们借助方便获取的线上线下学习资源进行课前自学,以便于老师留出课堂时间进 ...

  8. 新手如何学习Java——Java学习路线图

    推荐初学者阅读:新手如何学习Java——Java学习路线图

  9. hive mysql 初始化

    原文链接:https://juejin.im/post/59c3f8f75188255be81f91d9#heading-17 Apache Hive-2.3.0 快速搭建与使用 Hive 简介 Hi ...

  10. python网络编程之C/S架构介绍

    标签(空格分隔): c/s架构介绍 什么是C/S架构 C指的是client(客户端软件),S指的是Server(服务端软件),后续我们可以试着写个c/s软件实现服务器软件与客户端软件基于网络通信: 计 ...