prototype:构造函数的真相、原型链
函数不是构造函数,但是当且仅当使用 new 时,函数调用会变成 ‘构造函数调用’。那么对 ’构造函数‘ 最准确的解释是:所有带 new 的函数调用。
Nothing 只是一个普通的函数,但使用 new 调用时,它会构造一个对象并赋值给 a ,这个对象通过原型链关联着对象 Nothing。
虽然这和传统的‘类继承’很相似,但是 JavaScript 中的机制有一个核心区别,那就是不会进行复制,对象之间是通过内部的 [[prototype]] 链关联的。
因此,相比以‘继承’结尾的术语(‘原型继承’),‘委托’(‘原型委托’)更能表达 JavaScript 的真实机制,因为对象之间的关系不是复制而是委托。
Object.create(..)会创建一个新的对象 myObject 并把它关联到指定的对象 anotherObject,这样就可以充分利用 [[prototype]] 机制并避免不必要的麻烦(比如使用 new 的函数调用会生成.prototype 和 .constructor 引用)。
function Nothing() {
console.log( 'Dont mind me' );
}
// 会输出 'Dont mind me'
var a = new Nothing();
// 输出 {}
console.log(a);
// 函数不是构造函数,但是当且仅当使用 new 时,函数调用会变成 ‘构造函数调用’。那么对 ’构造函数‘ 最准确的解释是:所有带 new 的函数调用
// Nothing 只是一个普通的函数,但使用 new 调用时,它会构造一个对象并赋值给 a ,这个对象通过原型链关联着对象 Nothing。
// 虽然这和传统的‘类继承’很相似,但是 JavaScript 中的机制有一个核心区别,那就是不会进行复制,对象之间是通过内部的 [[prototype]] 链关联的。
// 因此,相比以‘继承’结尾的术语(‘原型继承’),‘委托’(‘原型委托’)更能表达 JavaScript 的真实机制,因为对象之间的关系不是复制而是委托。
var anotherObject = {
cool: function() {
console.log( 'cool' );
}
};
// Object.create(..)会创建一个新的对象 myObject 并把它关联到指定的对象 anotherObject,这样就可以充分利用 [[prototype]] 机制并避免不必要的麻烦(比如使用 new 的函数调用会生成.prototype 和 .constructor 引用)。
var myObject = Object.create( anotherObject );
// 调用的 myObject.cool() 并不在 myObject 里,这样设计的 API 即不好理解又不容易维护
myObject.cool();
myObject.doCool = function() {
// 委托设计模式:通过[[prototype]]委托到 anotherObject.cool()
this.cool();
}
myObject.doCool();
prototype:构造函数的真相、原型链的更多相关文章
- js面向对象、创建对象的工厂模式、构造函数模式、原型链模式
JS面向对象编程(转载) 什么是面向对象编程(OOP)?用对象的思想去写代码,就是面向对象编程. 面向对象编程的特点 抽象:抓住核心问题 封装:只能通过对象来访问方法 继承:从已有对象上继承出新的对象 ...
- 为什么Object.prototype在Function的原型链上与Function.prototype在Object的原型链上都为true
关于javascript的原型链有一个问题我一直很疑惑:为什么 Function instanceof Object 与 Object instanceof Function都为true呢? Func ...
- Inheritance and the prototype chain 继承和 原型 链
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain Inherita ...
- <JavaScript>constructor、prototype、__proto__和原型链
在看了网上很多相关的文章,很多都是懵逼看完,并不是说各位前辈们写得不好,而是说实在不容易在一两次阅读中理解透.我在阅读了一些文章后,自己整理总结和绘制了一些相关的图,个人认为会更容易接受和理解,所以分 ...
- JS 中的原型 -- prototype、__proto__ 以及原型链
原文: 1.深入理解javascript原型和闭包——prototype原型 2.三张图搞懂JavaScript的原型对象与原型链 打开浏览器控制台,任意定义一个对象,打印出来后,会发现有最后一定有一 ...
- (翻译) Inheritance and the prototype chain 继承和原型链
JavaScript is a bit confusing for developers experienced in class-based languages (like Java or C++) ...
- 原型及原型链,以及prototype和__proto__属性(笔记便于以后复习)
首先,js的数据结构有 原始类型(5种):Boolean.Number.String.Null.Underfined, 然后是引用类型:Array.Date.Error.RegExp.Function ...
- jacascript 构造函数、原型对象和原型链
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 先梳理一下定义: 我们通常认为 object 是普通对象,function 是函数对象: Function ...
- javascript原型与原型链,prototype、__proto__、constructor
javascript通过构造函数(constructor)和原型链来(prototype chain)实现其他面向对象语言的类概念.ES6语法中引入了“类”(class)的概念,但只是一个语法糖,只是 ...
- javascript prototype原型链的原理
javascript prototype原型链的原理 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: <script type="text/javasc ...
随机推荐
- Golang socket
1.本例子实现了一个简单的TCP echo.客户端发送Hello,服务端回应World. 参考:<Socket编程> 2.服务端代码 package main import ( " ...
- AtCoder Beginner Contest 113 D Number of Amidakuji
Number of Amidakuji 思路:dp dp[i][j]表示经过(i, j) 这个点的方案数 然后一层一层地转移, 对于某一层, 用二进制枚举这一层的连接情况, 判断连接是否符合题意, 然 ...
- Codeforces 1005 F - Berland and the Shortest Paths
F - Berland and the Shortest Paths 思路: bfs+dfs 首先,bfs找出1到其他点的最短路径大小dis[i] 然后对于2...n中的每个节点u,找到它所能改变的所 ...
- 记录python接口自动化测试--把测试结果写进excel文件(第九目)
python中一般使用xlrd(excel read)来读取Excel文件,使用xlwt(excel write)来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用xlrd读取 ...
- pip3 install requests Cannot open D:\Python35\Scripts\pip3-script.py
1.问题描述: 使用pip(或pip3)指令安装模块时,出现了Cannot open D:\Python35\Scripts\pip3-script.py的报错信息 2.原因分析: pip安装出错 3 ...
- 20170822xlVBA ExportCellPhone
Public Sub GetCellPhone() Dim CellPhone As String Dim Arr As Variant Dim Brr As Variant Dim n As Lon ...
- (GoRails)使用vue和Vuex管理嵌套的JavaScript评论, 使用组件vue-map-field
嵌套的JavaScript评论 Widget Models 创建类似https://disqus.com/ 的插件 交互插件: Real time comments: Adapts your site ...
- gcc -02引起内存溢出'unsigned i'应修订为'volatile unsigned i'
2017-12-13 10:44:19gcc -02引起内存溢出'unsigned i'应修订为'volatile unsigned i' 1.3.100 driver/char/random.cst ...
- Elasticsearch SQL
es sql是一个X-pack组件 ,允许对es执行类似sql的查询,可以将Elasticsearch SQL理解为一个编译器,既能理解es,又能理解sql.可以通过利用es,实施大规模实时读取和处理 ...
- 如何在mmseg3添加词库
一.了解几个文件 ll /usr/local/mmseg/etc/mmseg.ini uni.lib 编译后的词库,给sphinx 用的unigram.txt 原词库给人看的, 在这里面人工添加自 ...