javascript 高级程序设计 十一
接上一节的创建对象的模式:
原型模式:
对于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 高级程序设计 十一的更多相关文章
- 《JavaScript高级程序设计(第3版)》笔记-序
很少看书,不喜欢看书,主要是上学时总坐不住,没有多大定性,一本书可以两天看完,随便翻翻,也可以丢在角落里几个月不去动一下. 上次碰到了<JavaScript高级程序设计(第3版)>感觉真的 ...
- 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介
前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...
- 【javascript学习——《javascript高级程序设计》笔记】DOM操作
DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘了一个层次节点树,允许开发人员添加.移除和修改. 1.节点层次 <html> <head& ...
- 读javascript高级程序设计00-目录
javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...
- 《JavaScript高级程序设计》读书笔记--前言
起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...
- 阅读摘录《javascript 高级程序设计》01
前言: 因为工作需要,所以开始主攻前台JS方面的技术.在以前的工作中,使用过这门脚本语言.但是都是比较凌乱的,用到什么学什么,只是为了实现业务,而去使用. 不会考虑到代码优化,封装对象等.今次特意借了 ...
- 《JavaScript高级程序设计》学习笔记(5)——面向对象编程
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...
- 《JavaScript高级程序设计》学习笔记(4)——引用类型
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第五章内容. 在ECMAScript中, ...
- 《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第四章内容. 1.函数:通过函数可以封装 ...
随机推荐
- Redis入门及主从配置
1.Redis入门简介 Redis是一个开源的使用ANSI C语音编写.支持网络.可基于内存亦可持久化的日志型,Key-Value数据库.支持存储的value类型包括 string(字符串).list ...
- 使用qt creator4.XXX,b编辑和调试caffe,太好用了
一直想看caffe的源代码,网上看了一个qt的例子,但是自己也有qt creator,怎么就不行 后面发现是自己的版本太低所以不好用(可能是自己能力有限) 可以参考下面这个链接: 使用qt creat ...
- kafka 配置启动
Kafka配置(注意log.dirs不要配置在tmp目录下,因为该目录会被linux定时任务删除,会导致kafka崩溃)需要三个Kafka实例,分别安装在下面三个机器上:192.168.240.167 ...
- jquery 中attr()的一个用法
html 如下: <ul><li><img src="./img/addface_icon.png" alt="">< ...
- java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1) for method ApiService.getMethod
@FormUrlEncoded @POST("getMethod") Observable<Bean> getMethod(String field); 今天在写Ret ...
- Realtime Rendering 1.1
[Realtime Rendering 1.1] 1.A linear transform is one that preserves vector addition and scalar multi ...
- STO单没有取进FP,IN_SAELS_ORDER表无,但IN_PO_STO有
描述 :业务反馈STO单没有取进FP,经检查IN_SALES_ORDER表没有此单数据,但在IN_PO_STO表却有 跟进如下: 1.检查IN_PO_STO表是否有数据 '; 2.检查SAP_SALE ...
- python 常用模块(一): random , time , sys , os模块部分知识.
1.常用模块:(1)collectiaons模块 (2)与时间相关 time模块 (3)random模块 (4)os模块 (5)sys模块 (6) 序列化模块: json , pickle 2 ...
- Pandas操作数据库及保存csv
数据的保存 import pandas as pd import numpy as np from pandas import Series col_db = [['one',1,2,3,4,np.n ...
- BeautifulSoup中查找元素 select() 和find()区别
从html中查找元素,之前一般都用find(),查找符合条件的第一个,如下 f = open(file, 'r') # 读取文件内容content = f.read()soup= BeautifulS ...