《JS权威指南学习总结--6.1原型》
内容要点:
一.每一个JS对象(null除外)都和另一个对象相关联。"另一个"对象就是我们熟知的原型,每一个对象都从原型继承属性.
二.所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过JS代码Object.prototype获得对原型对象的引用。
三.通过关键字new和构造函数调用创建的对象的 原型 就是 构造函数的prototype属性 的值。(见例9-2)
四.使用{}创建对象一样,通过new Object()创建的对象也继承自Object.prototype.
同样,通过new Array()创建的 实例对象的原型 就是Array.prototype, (Array,Date等都是JS内部构造函数)
通过new Date()创建的 实例对象的原型 就是Date.prototype.
五.
没有原型的对象为数不多,Object.prototype就是其中之一。它不继承任何属性。其他原型对象都是普通对象,普通对象都具有原型。
所有的内置构造函数(以及大部分自定义的构造函数)都具有一个继承自Object.prototype的原型。
例如:
Date.prototype的属性继承自Object.prototype,因此new Date()创建的Date对象的属性同时继承自Date.prototype和Object.prototype.
这一系列链接的原型对象就是所谓的"原型链"。
六.Object.create()
1.ECMAScript5定义了一个名为Object.create()的方法,它创建了一个新对象,其中第一个参数是这个对象的原型。Object.create()提供第二个可选参数,用以对对象的属性进行进一步描述.
2.
var o1=Object.create({x:1,y:2}); //o1继承了属性x和y
var o2=Object.create(null); //o2不继承任何属性和方法
var o3=Object.create(Object.prototype); //o3和{}和new Object()一样 可以通过任意原型创建新对象(换句话说,可以使任意对象可继承);
3.通过原型继承创建一个新对象
//inherit()返回了一个继承自原型对象p的属性的新对象
//这里使用ECMAScript 5中的Object.create()函数(如果存在的话)
//如果不存在Object.create(),则退化使用其他方法
function inherit(p){
if(p==null) throw TypeError(); //p是一个对象,不能为null
if(Object.create) //如果Object.create()存在,直接使用它,否则进一步检测
return Object.create(p);
var t=typeof p;
if(t!=="object" && t!=="function") throw TypeError();
function f(){}; //定义一个空构造函数
f.prototype=p; //将其原型属性设置为p
return new f(); //使用f()创建p的继承对象
}
inherit()函数的其中一个用途就是防止库函数无意间(非恶意地)修改那些不受你控制的对象。
不是将对象直接作为参数传入函数,而是将它的继承对象传入函数。
当函数读取继承对象的属性时,实际上读取的是继承来的值。
如果给继承对象的属性赋值,则这些属性只会影响这个继承对象自身,而不是原始对象。
var o={x : "don't change this value"};
library_function(inherit(o)); //防止对o的意外修改
《JS权威指南学习总结--6.1原型》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- Unity3D 浏览工具
键盘控制: 1.键盘箭头:先选中场景激活场景 按箭头前后左右 shift +箭头 加速移动 2.使物体成为场景焦点:左侧层次视图列表选中物体,移动鼠标指针到场景视图上 按F,选中物体成为场景视图中心 ...
- windows环境自动获取SVN仓库当前版本
如果我们的软件能够自动引入SVN修订号(仓库版本号),那么我们开发软件的时候就能快速定位bug出自哪个SVN版本.那么如何让软件直接自动生成并引用SVN版本号呢? 我们可以使用SVN info命令,在 ...
- 关于ueditor1.4.2 与Jquery 验证同时使用失效
ueditor1.4.2 与Jquery 验证时,验证失效! 官方解决办法: ueditor.config.js里面,找到toolbars参数,吧simpleupload一项去掉,问题就没了 官方回复 ...
- Heap Sort
#include<iostream> using namespace std; const int MAX = 1001; int l[MAX]; //Heap Sort void Hea ...
- 修改release management client对应的服务器的地址
参考资料:http://stackoverflow.com/questions/25313053/how-to-change-a-release-management-server-name-in-r ...
- Openjudge-NOI题库-蛇形填充数组
题目描述 Description 用数字1,2,3,4,...,n*n这n2个数蛇形填充规模为n*n的方阵. 蛇形填充方法为: 对于每一条左下-右上的斜线,从左上到右下依次编号1,2,...,2n-1 ...
- 关于Objective-C Associated Objects
一.相关函数 与Associated Objects相关的函数有三个 1 void objc_setAssociatedObject(id object, const void *key, id va ...
- 认识css
(一)认识css: CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小.颜色.字体加粗等. ...
- qmake 小结(Qt 5.4)
FROMS 变量的定义必须在include之前. MOC_DIR UI_DIR RCC_DIR 的定义必须使用绝对路径.
- Python学习笔记——基础篇【第五周】——算法(4*4的2维数组和冒泡排序)、时间复杂度
目录 1.算法基础 2.冒泡排序 3.时间复杂度 (1)时间频度 (2)时间复杂度 4.指数时间 5.常数时间 6.对数时间 7.线性时间 1.算法基础 要求:生成一个4*4的2维数组并将其顺时针旋 ...