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

原型模式:

  对于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. CSS 字体风格

    粗体 font-weight 属性可以设置文本的粗细. 它有两个属性: normal 普通粗细 bold 粗文本 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  2. MySQL可以通过phpmyadmin连接,但是无法通过SqlYog(Windows)或Sequel Pro(Mac)下进行远程连接

    更改数据库密码: update user set password=passworD("sunjingyu0509!") where user='root'; flush priv ...

  3. Excel 如何快速切换到最后一行

    1.快速切换到最后一行,是ctrl+↓箭头(来源:百度) 2. http://www.office68.com/excel/22936.html     一.定位到第一个单元格        方法1: ...

  4. Python基础之字典操作

    字典 字典的优点: dict key 必须是不可变数据类型,可哈希, value:任意数据类型. dict 优点:二分查找去查询 存储大量的关系型数据 特点:无序的(指的是不可人为的去改变顺序) 数据 ...

  5. Spring AOP学习笔记

      Spring提供了一站式解决方案:          1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系          2) Spring Web ...

  6. 截图软件FastStone

    屏幕截图软件(FastStone Capture) 好用,可以粘贴 / 复制. 可以做页面设计,有屏幕标尺,取色器.

  7. mysqlli

    ./configure --with-mysql=/usr/bin/mysql_config \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd ht ...

  8. 如何修改Eclipse的 workspace目录

    Eclipse是一款很强的Java IDE, eclipse ide for eclipse committers 这里的committers 就是投稿者与执行者的意思,也就是说这个eclipse是为 ...

  9. codis

    总体架构 192.168.199.223(zookeeper.codis-proxy.codis-dashborad:18080.codis-fe:18090.codis-server) 192.16 ...

  10. ffmpeg编码中的二阻塞一延迟

    1. avformat_find_stream_info接口延迟 不论是减少预读的数据量,还是设置flag不写缓存,我这边都不实用,前者有风险,后者会丢帧,可能我还没找到好姿势,记录在此,参考:htt ...