JS中的继承链
我们首先定义一个构造函数Person,然后定义一个对象p,JS代码如下:
function Person(name) {
this.name = name;
}
var p = new Person("Ben");
console.log(p.name);
上面new过程中,p对象的__proto__属性会指向Person构造函数的prototype。
实际上new过程由三步组成,具体参见我的另外一篇博客。
自己定义构造函数时有两点需要注意:
1. 由构造函数生成的对象都有__proto__属性,对象的__proto__属性指向构造函数的prototype.
2. 构造函数也是对象,因此也具有__proto__属性,该属性指向Function.prototype.
第二点可以通过下面代码看出来:
//函数声明
function Person(name) {
this.name = name;
} //函数表达式
var Person = function(name) {
this.name = name;
}; //函数表达式方式实际上就相当与new Function
var Person = new Function("name", "this.name = name;");
这三种函数(这里是构造函数)基本上是等价的,除了函数声明提升之外(第一种会发生“函数声明提升”)。
可以参考下面的内存图:

var a = {name: "dadi"};
console.log(a.__proto__ === Object.prototype);
function fun(){}
console.log(fun.__proto__ === Function.prototype);
console.log(fun.prototype.__proto__ === Object.prototype);
所有对象的原型链最终指向的对象都是Object.prototype这个引用指向的对象,暂且称为祖先对象,这个对象也有__proto__属性,这个__proto__=null.
自己定义的Person()函数具有prototype属性, 该属性的初始值是一个"空"对象.
typeof Person.prototype;//"object"
当然我们也可以手动添加prototype属性:
Person.prototype = {constructor: Person};//与自动创建的prototype属性是等价的.
别忘了constructor属性.
该图借鉴这篇博客:
http://blog.csdn.net/lmj623565791/article/details/24423881
JS中的继承链的更多相关文章
- js中实现继承的几种方式
首先我们了解,js中的继承是主要是由原型链实现的.那么什么是原型链呢? 由于每个实例中都有一个指向原型对象的指针,如果一个对象的原型对象,是另一个构造函数的实例,这个对象的原型对象就会指向另一个对象的 ...
- 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...
- JS中的继承(上)
JS中的继承(上) 学过java或者c#之类语言的同学,应该会对js的继承感到很困惑--不要问我怎么知道的,js的继承主要是基于原型(prototype)的,对js的原型感兴趣的同学,可以了解一下我之 ...
- JS中的继承(下)
JS中的继承(下) 在上一篇 JS中的继承(上) 我们介绍了3种比较常用的js继承方法,如果你没看过,那么建议你先看一下,因为接下来要写的内容, 是建立在此基础上的.另外本文作为我个人的读书笔记,才疏 ...
- js中的继承和重载
js中有三种继承方式:一.通过原型(prototype)实现继承 二.借用构造函数式继承,可分为通过call()方法实现继承和通过apply()方法实现继承 仅仅通过原型继承我们可以发现在实例化子 ...
- js中的原形链问题
---恢复内容开始--- 一.在js中大家讨论的原形链都是围绕在prototype和__proto__. 1.__proto__是内部原型 2.prototype是构造器原型(构造器就是构造函数) 3 ...
- 浅谈JS中的继承
前言 JS 是没有继承的,不过可以曲线救国,利用构造函数.原型等方法实现继承的功能. var o=new Object(); 其实用构造函数实例化一个对象,就是继承,这里可以使用Object中的所有属 ...
- JS中对象继承方式
JS对象继承方式 摘自<JavaScript的对象继承方式,有几种写法>,作者:peakedness 链接:https://my.oschina.net/u/3970421/blog/28 ...
- 详细理解JS中的继承
正式说继承之前,有两个相关小点: JS只支持实现继承,即继承实际的方法,不支持接口继承(即继承方法的签名,但JS中函数没签名) 所有对象都继承了Object.prototype上的属性和方法. 说继承 ...
随机推荐
- 关于KMP
KMP算法,对于求b串在a串中出现的次数. 在学习KMP之前,希望大家充分掌握hash. HASH: 1.hash表:用来离散化(hash数组,hash链表) 2.Rabin-Kap算法: 可替代KM ...
- 带阴影的圆形 QLabel
带阴影的圆形 Label 来自: 公孙二狗
- [LOJ#6033]. 「雅礼集训 2017 Day2」棋盘游戏[二分图博弈、匈牙利算法]
题意 题目链接 分析 二分图博弈经典模型,首先将棋盘二分图染色. 考虑在某个最大匹配中: 如果存在完美匹配则先手必败,因为先手选定的任何一个起点都在完美匹配中,而后手则只需要走这个点的匹配点,然后先手 ...
- 如何在Windows Server 2003搭建Windows+iis+asp+access环境
前提系统盘镜像要加载进来方案一:开始->管理您的服务器->添加或删除角色->下一步->自定义配置->下一步->选择应用程序服务器(IIS,ASP.NET)-> ...
- Git版本库的创建(Ubuntu)
在Ubuntu上学习Git随笔. 一. git 仓库的安装 git 在终端用git命令查看Ubuntu是否安装git版本库,如果没有安装,最新版本(Ubuntu18.04)会提示用下面命令进行安装. ...
- 原生和jquery 的 ajax
form数据的序列化: $('#submit').click(function(){ $('#form').serialize(); //会根据input里面的name,把数据序列化成字符串:eg:n ...
- PAT甲题题解-1067. Sort with Swap(0,*) (25)-贪心算法
贪心算法 次数最少的方法,即:1.每次都将0与应该放置在0位置的数字交换即可.2.如果0处在自己位置上,那么随便与一个不处在自己位置上的数交换,重复上一步即可.拿样例举例: 0 1 2 3 4 5 ...
- Notes of Daily Scrum Meeting(12.8)
今日团队任务总结: 团队成员 今日团队工作 陈少杰 使用例子对json数据进行解析 王迪 确定搜索功能的接口 金鑫 对布局文件进行协助修改 雷元勇 开始进行搜索功能的代码实现 高孟烨 按照学长的样本对 ...
- 四则运算app第一阶段冲刺
第一阶段冲刺 [开发环境]:eclipse [开发项目]:小学生四则运算APP [开发人员]:郑胜斌 http://www.cnblogs.com/zsb1/ 孔德颖 http://www.cnblo ...
- img 分区响应图
---恢复内容开始--- a标签的target为_blank属性,意为跳转到新的页面. shape要和coords配合使用,shape为rect时意义为矩形.shape 为不同属性时意为不同的形态触碰 ...