理解JavaScript中的原型继承(2)
两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客:
这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误理解。今天看《Understanding Scopes》这让我从新思考了一下原型继承,更重要的是站在一个继承设计者的角度再看一下原型继承。
在传统的面向类的继承体系中,我们有个Best Practices是优先使用(对象)组合代替(类)继承,而原型继承是这个思想的一个运用。和面向对象和函数式编程一样,使用几乎任何语言都可以实现这样的思想,我以前学的只是这个思想的一个JavaScript实现,而已。
基于原型的继承其实是一种组合式的继承,朴素的说法就是子域中属性找不到的话就去父域中找找,这里的父域是用原型(__proto__)去引用的,依次递归整个原型链。最终的实现其实就是对象的组合。子对象包含父对象的引用。既然是继承必然涉及到重名问题,子对象和父对象各自相当于一个作用域,重名问题的处理也是就近(可覆盖shadow/隐藏hide)原则,即子作用域的同名属性会起作用,隐藏了父作用域的同名属性,但是由于是组合,这两个属性是独立的。我们用伪代码看看:
aParent = {name:’jerry’}
aChild = {__proto__:aParent, name:’frank’}
aChild中的name和aParent中的name是各自独立的。我们aChild.name=’unknown’并不会改变aParent.name。
有一点要拿出单独说说,造成迷糊的最大根源就是误解,对于如下代码:
aParent = {name:’jerry’}
aChild = {__proto__:aParent}
若我们取aChild.name的值,我们很容易resolve,那就是子域中找不到,去父域中找,找到了jerry。但是对于:aChild.name = ‘frank’这样的赋值代码我们会产生歧义(ambiguous),我们可能有两中含义:
1,更新父域中的name属性为frank。
2,设置子域中的name属性为frank。
JavaScript选用的方式是第2种。即设置(新建)子域自己的name属性为frank,并隐藏了父域中的name属性。我们通常误以为JavaScript是按1的方式工作,其实不是。
另外类(模版)其实在编程语言的实现中是可有可无的,像JavaScript压根就没有类(模版),他只有对象,new Point()只不过是一个语法糖,跟aObj = createObject()是一样的,只是调用一个方法去生成一个对象,而已。
理解JavaScript中的原型继承(2)的更多相关文章
- javascript中的原型继承
在Javascript面向对象编程中,原型继承不仅是一个重点也是一个不容易掌握的点.在本文中,我们将对Javascript中的原型继承进行一些探索. 基本形式 我们先来看下面一段代码: <cod ...
- 理解javascript中的原型模式
一.为什么要用原型模式. 早期采用工厂模式或构造函数模式的缺点: 1.工厂模式:函数creatPerson根据接受的参数来构建一个包含所有必要信息的person对象,这个函数可以被无数次的调用,工厂 ...
- 如何理解JavaScript中的原型和原型链
首先是一张关系图,避免抽象化理解时产生的困难 Function对象 函数对象是JavaScript学习中不可避免的一部分,而且这一部分相对重要且抽象 函数的创建方式有2种: 字面量创建 var foo ...
- javascript 中的原型继承
javascript圆形变成的基本规则: 所有数据都是对象: 要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它: 对象会记住它的原型: 如果对象无法响应某个请求,它会把这个请求委托给 ...
- 简单理解javascript中的原型对象,实现对之间共享属性和行为
javascript中提供了构造函数.可以方便的创建对象. 典型的构造函数例如以下: function Person(name, age) { this.name = name; this.age = ...
- 深入理解JavaScript中的类继承
由于写本文时全部是在编辑器中边写代码边写感想的,所以,全部思想都写在代码注释里面了 // 类继承 //todo.1 extends 关键字 class Animal { constructor(nam ...
- JavaScript中的原型继承原理
在JavaScript当中,对象A如果要继承对象B的属性和方法,那么只要将对象B放到对象A的原型链上即可.而某个对象的原型链,就是由该对象开始,通过__proto__属性连接起来的一串对象.__pro ...
- Javascript中的原型继承具体解释
js中的继承,是面向对象的知识,由于js没有类的概念.所以继承是通过对象实现的.谈到继承.就必须说到prototype,就不得不先说下new的过程. 一个小小的列子: <script type= ...
- 一句话简单理解javascript中的原型对象
通过构造函数F创建的对象实例p 这个对象p的原型对象是 构造函数中prototype属性指向的对象s,这个对象p中也有个非标准的__proto__属性指向构造函数prototype属性所指向的对象s, ...
随机推荐
- js中的延迟执行和定时执行
在js中,延迟执行函数有两种,setTimeout和setInterval,用法如下: function testFunction(){Console.log('hovertree.com');} s ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(一)ConnectionState
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- sqlserver中的循环遍历(普通循环和游标循环)
sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student
- 第一讲:WCF介绍
代码 https://yunpan.cn/cPns5DkGnRGNs 密码:3913 ...
- PHP中用GD绘制饼图
PHP中用GD绘制饼图,绘制的类见代码: Class Chart{ private $image; // 定义图像 private $title; // 定义标题 private $ydata; // ...
- 优化JavaScripe 提升首页加载速度的几种方案解析
优化目的: 1. 减少load量. 2. 优化js,加快页面加载速度. 网站中最影响网站打开速度的是什么?我会告诉是网站中的javascript,简称JS.模板中引用的JS文件越多,打开速度越慢,细读 ...
- No.010:Regular Expression Matching
问题: Implement regular expression matching with support for '.' and '*'.'.' Matches any single charac ...
- Linux命令详解之—more命令
Linux more命令同cat命令一样,多用来查看文件内容,本文就为大家介绍下Linux more命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux的more命令类似 ca ...
- jquery学习笔记:获取下拉框的值和下拉框的txt
<div class="form-group"> <select class="form-control" id="iv_level ...
- EntityFramework动态多条件查询与Lambda表达式树
在常规的信息系统中, 我们有需要动态多条件查询的情况, 例如UI上有多个选择项可供用户选择多条件查询数据. 那么在.net平台Entity Framework下, 我们用Lambd ...