在 JS 中,函数本身也是一个包含了方法(如apply和call)和属性(如length和constructor)的对象,而prototype也是函数对象的一个属性

function f(){}

f.constructor //function Function(){[native code]}

可为prototype对象赋予属性和方法,只有当f作为构造器使用时,这些属性才会起作用

添加属性和方法除了在构造函数中,还可通过prototype属性来增加该构造器所能提供的功能

function Snake(name){
this.name = name;
this.eat = function(){}
}
Snake.prototype.color = 'grey';
Snake.prototype.sleep = function(){}

若不想逐一添加,也可定义一个对象,然后将其覆盖到之前原型上

Snake.prototype = {
color:'grey';
sleep:function(){}
}

在 JS 中,几乎所有对象都是通过传引用的方式来传递的,因此所创建的每个新对象实体中并没

有一份属于自己原型副本。这也就意味着可随时修改 prototype 属性,并且由同

一构造器创建的所有对象的 prototype 属性也都会同时改变(甚至还会影响在修改之前

就已经创建了的那些对象)

访问某个属性时,JS引擎会遍历该对象的所有属性,找到则立即返回,找不到则会去创建当前对象的构造器函数的原型里找

每个对象都会有一个构造器,而原型本身也是一个对象,这意味着它必然也有一个构造器,而这个构造器又会有自己的

原型。于是这种结构可能会一直不断地持续下去,并最终取决于原型链(prototype chain)的长度,但其最后一环肯定是 Object 内建对象,因为它是最高级的父级对象。

使用hasOwnProperty()方法可判断某属性是对象自身属性还是原型属性,返回布尔类型,false为原型属性

对象中不是所有的属性都会在 for-in 循环中显示,如(数组的)length 属性和

constructor 属性就不会被显示,那些会显示的属性被称枚举属性,可以通过各个对象所提供的 propertyIsEnumerable()方法来判断对象的某

个属性是否可枚举,在 ES5 中,可以具体指定哪些属性可枚举,而在 ES3 中没有这个功能

for-in中原型链中的各个原型属性也会被显示出来,当然前提是它们是可枚举的

对于所有的原型属性,propertyIsEnumerable()都会返回 false,包括那些在 for-in 循环中可枚举的属性

function Gadget(name, color) {
this.name = name;
this.color = color;
this.getName = function(){
return this.name;
};
}
Gadget.prototype.price = 100;
Gadget.prototype.rating = 3; var newtoy = new Gadget('webcam','black'); for(var k in newtoy){
if(newtoy.hasOwnProperty(k)){
console.log(k + '=' + newtoy[k]); //打印自身的可枚举属性
}
} newtoy.propertyIsEnumerable('name'); //true //而对于内建属性和方法来说,它们大部分都是不可枚举的:
newtoy.propertyIsEnumerable('constructor'); //false //另外,任何来自原型链中的属性也是不可枚举的:
newtoy.propertyIsEnumerable('price'); //false //但是需要注意的是,如果 propertyIsEnumerable()的调用是来自原型链上的某个对象,那么该对象中的属性是可枚举的
newtoy.constructor.prototype.propertyIsEnumerable('price'); //true

每个对象都有个isPrototypeOf()方法,用以判断当前对象是否是另一个对象的原型

var monkey = { name:'Sam' };
function Human(){};
Human.prototype = monkey; var george = new Human(); //monkey是george的原型吗?
monkey.isPrototypeOf(george); //true

大多数浏览器可得到某个对象的原型,因为大多数浏览器都实现了ES5的Object.getPrototypeOf()方法

Object.getPrototypeOf(george) //{ name:'Sam' }

在IE中不存在__proto__,另外__proto__和prototype并不是等价的

__proto__实际上是某个实例对象的属性,而prototype则是属于构造器函数的属性

typeof george.__proto__; //"object"

typeof george.prototype; //"undefined"

typeof george.constructor.prototype; //"object"

所以__proto__只能在学习或调试的环境下使用

「JavaScript面向对象编程指南」原型的更多相关文章

  1. 「JavaScript面向对象编程指南」基础

    DOM标准是独立的(即并不依赖JS)操作结构化文档的方式 BOM实际是个与浏览器有关的对象集合,原来没任何标准可言,H5诞生后才被定义了一些浏览器间通用的对象标准 ES5严格模式"use s ...

  2. 「JavaScript面向对象编程指南」对象

    对象的属性名可加上引号,下面三行代码所定义的内容是完全相同的 var hero = { occupation : 1 }; var hero = { "occupation" : ...

  3. 「JavaScript面向对象编程指南」闭包

    闭包 JS只有函数作用域,函数外为全局变量,函数内为局部变量 绿圆是函数fn的作用域,在这范围内可访问局部变量b和全局变量a,橙圆是fn内部函数inner的作用域,此范围内可访问自身作用域内的变量c, ...

  4. JavaScript面向对象编程指南(五) 原型

    第5章 原型 5.1 原型属性 function f(a,b){ return a*b; }; // length 属性 f.length; // constructor 构造属性 f.constru ...

  5. 《JavaScript面向对象编程指南(第2版)》读书笔记(二)

    <JavaScript面向对象编程指南(第2版)>读书笔记(一) <JavaScript面向对象编程指南(第2版)>读书笔记(二) 目录 一.基本类型 1.1 字符串 1.2 ...

  6. 《JavaScript面向对象编程指南(第2版)》读书笔记(一)

    目录 一.对象 1.1 获取属性值的方式 1.2 获取动态生成的属性的值 二.数组 2.1 检测是否为数组 2.2 增加数组长度导致未赋值的位置为undefined 2.3 用闭包实现简易迭代器 三. ...

  7. 《JavaScript面向对象编程指南》读书笔记②

    概述 <JavaScript面向对象编程指南>读书笔记① 这里只记录一下我看JavaScript面向对象编程指南记录下的一些东西.那些简单的知识我没有记录,我只记录几个容易遗漏的或者精彩的 ...

  8. 《JavaScript面向对象编程指南》读书笔记①

    概述 JavaScript快忘完了,想看一本专业书拾遗,所以看了这本<JavaScript面向对象编程指南>. 个人觉得这本书讲的很透彻很易懂,一些原来有疑惑的地方在这本书里面豁然开朗,看 ...

  9. 闭包初体验 -《JavaScript面向对象编程指南》

    下面是我对闭包的理解:(把他们整理出来,整理的过程也是在梳理) 参考<JavaScript面向对象编程指南> 1.首先,在理解闭包之前: 我们首先应该清楚下作用域和作用域链 作用域:每个函 ...

随机推荐

  1. 软工+C(11): 从命令行开始逐步培养编程能力(Java)

    上一篇:助教指南,持续更新... // Version: 0.0.4 许多人,所不知道的是,每一种编程语言都有其对应的单元测试框架,对程序在不同阶段的测试环节也概念模糊.在实际动手编写程序许久之后才听 ...

  2. JS对JSON对象遍历输出的时候真的是按照顺序输出吗?

    对象的遍历输出并不是按照对象属性定义顺序来的,那么是按照什么规则来的呢,仔细深入研究你会发现,这还跟浏览器有关系,Chrome跟IE是不一样的,所以给出以下结论: Chrome Opera 的 Jav ...

  3. CentOS7桌面版系统使用的一些小技巧

    1. 清空~/.kde/ 文件下的文件,登陆后不显示桌面的解决方法 在使用CentOS7 桌面系统时,有时候打开文件会很卡.这时我们需要清空当前用户下的 .kde 文件下的所有文件. 再重新登陆该用户 ...

  4. Debian社区群龙无首

    导读 前两天有过消息 Debian 包维护者 Michael Stapelberg 因对 Debian 社区的现状不满而宣布退出 Debian 的维护,该消息引发了人们对于 Debian 的担忧.11 ...

  5. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

  6. 使用lambda表达式对相同属性的实体进行合并

    List<CrmAuthorizedInfo> crmAuthorizedInfos = flowPlanInfoMapper.findAllByEncode(stationForm.ge ...

  7. 大规模使用 Apache Kafka 的20个最佳实践

    必读 | 大规模使用 Apache Kafka 的20个最佳实践 配图来源:书籍<深入理解Kafka> Apache Kafka是一款流行的分布式数据流平台,它已经广泛地被诸如New Re ...

  8. java反射机制简单实例

    目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...

  9. python之路day08--文件的操作

    文件的操作 hanfei的博客.txt 1/文件的路径2.编码方式3.操作方式:只读,只写,追加,读写,写读... 只读 f=open('hanfei的博客',mode='r',encoding='u ...

  10. Ubuntu18.04关机卡死问题

    直接进入正题!你的电脑卡死说明带有独显!而Ubuntu默认是不给你的显卡装驱动的,那这就导致关机卡死的问题.按住键盘Ctrl+Alt+T打开终端,输入下面的命令 software-properties ...