在 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__只能在学习或调试的环境下使用

转载于:https://www.cnblogs.com/Grani/p/10655005.html

「JavaScript面向对象编程指南」原型相关推荐

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

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

  2. 《javascript面向对象编程指南》读书笔记

    <javascript面向对象编程指南>读书笔记 <javascript面向对象编程指南>读书笔记 第一章 面向对象的JavaScript 第二章 基本数据类型与流程控制 变量 ...

  3. 《JavaScript面向对象编程指南》——第1章 引言1.1 回顾历史

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.1节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  4. 《JavaScript面向对象编程指南》——1.3 分析现状

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.3节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  5. 《JavaScript面向对象编程指南》——1.7 训练环境设置

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.7节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  6. 《JavaScript面向对象编程指南》—第128页错误指正

    最近在阅读<JavaScript面向对象编程指南第2版>,感觉很有帮助.今晚发现一个小错误,想指正一下. 如图,书中第128页: 书中的第三个例子代码如下: "potato&qu ...

  7. Javascript面向对象编程指南笔记 - 第三章 - 函数

    第三章 函数 第三章 函数 3-1 什么是函数 3-1-1 调用函数 3-1-2 参数 3-2 预定义函数 3-2-1 parseInt 3-2-2 parseFloat 3-2-3 isNaN 3- ...

  8. JavaScript 面向对象编程(二) —— 构造函数 / 原型 / 继承 / ES5 新增方法

    本篇为 JavaScript 进阶 ES6 系列笔记第二篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 : Javascript 继承机制的 ...

  9. javascript 面向对象编程(工厂模式、构造函数模式、原型模式)

    javascript 面向对象编程(工厂模式.构造函数模式.原型模式) CreateTime--2018年3月29日17:09:38 Author:Marydon 一.工厂模式 /*** 工厂模式*/ ...

最新文章

  1. 时间复杂度与空间复杂度分析
  2. 分类图 Class Diagram
  3. json java对象 简书_Java 对象的 Json 化与反 Json 化
  4. 聊聊高并发(二十)解析java.util.concurrent各个组件(二) 12个原子变量相关类
  5. as cast float server sql_面试常考!SQL行转列和列转行
  6. 系统分析师资料_软考 系统分析师考试通过总结
  7. 2020年9月“省时查报告”十大热门报告盘点(附下载链接)
  8. java 银行卡号格式化_JS银行卡号格式化 - JavaScript常用效果 - Front-End - NalanXue's Blog...
  9. Jquery ThickBox的使用
  10. Redis 官方文档译注
  11. 【教程】NEC e-Border Client的设置图文教程(中文版)
  12. 南琼考试系统APP服务器,南琼考试系统
  13. 纠错码与魔术(一)——纠错码与汉明码简介
  14. PDCA循环的四个阶段八个步骤,你知道么?
  15. 转载ios开发如何使用Xcode的Targets来管理开发和生产版本的构建
  16. cdr多页面排版_教你怎样在CDR怎样编号自动排版.doc
  17. html onload div,将备用页面内容加载到div onload中
  18. 我是学计算机的表情包,我是一个热爱学习的人表情包
  19. Auto.js调试:使用雷电模拟器的网络模式进行调试
  20. 联通烽火hg220桥接tplink路由器

热门文章

  1. ubuntu sendmail安装和使用具体实现[转]
  2. [翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景
  3. angular HttpClient 配置
  4. 10. Firewalls (防火墙 2个)
  5. 表空间检测异常的问题诊断
  6. 原生js实现canvas气泡冒泡效果
  7. no protocol specified
  8. linux中的umask 函数
  9. DropDownList的用法
  10. 第十一章 “她”值多少钱