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 ...
随机推荐
- 虹软人脸识别SDK的接入方法
背景: 虹软的人脸识别还是不错的,在官方注册一个账号,成为开发者,下载SDK的jar包,在开发者中心,找一个demo就可以开始做了,安装里边的逻辑,先看理解代码,然后就可以控制代码,完成自己想要的功能 ...
- 学习笔记5—Python 将多维数据转为一维数组 (总结)
<code class="language-python">import operator from functools import reduce a = [[1,2 ...
- ftp服务器搭建(离线安装vsftpd),配置
1.下载vsftp:http://rpmfind.net/linux/rpm2html/search.php?query=vsftpd(x86-64) 2.检查是否已经安装了vsftp rpm -qa ...
- EOJ Monthly 2018.11 D. 猜价格
猜价格 分两种情况讨论: k≤n,先猜至多 k 次 1,由于回答 <1 肯定是假的,所以可以把剩余系下是哪次错试出来,然后用至多 n 次搞定. k>n,每个数都猜两次,如果两次结果不一样, ...
- 最常出现的字符串 Most Common Word
2018-10-26 00:32:05 问题描述: 问题求解: 方法一.Trie 最长出现的字符串,最容易想到的解法就是Trie树了,于是首先使用Trie树进行了实现,代码量有点大,当然了是可以A掉的 ...
- spring集成JMS访问ActiveMQ
首先我们搭建一个spring-mvc项目,项目可以参考:spring-mvc 学习笔记 步骤: 在pom.xml中加上需要的包 修改web.xml,增加IOC容器 spring配置文件applicat ...
- Getting Started with Processing 第四章总结
为什么要使用变量: 我们使用变量的一个重要原因就是避免变成过程中的重复工作,如果你重复使用某一个数字超过了一次,就可以考虑使用一个变量来代替它,这样你的程序会更加通用并且易于更新. 定义变量 定义变量 ...
- Feign二:复写Feign的默认配置
Feign二:复写Feign的默认配置 1.在启动文件加入feign注解:@EnableFeignClients FeignApp.java import org.springframework.bo ...
- 雷林鹏分享:jQuery EasyUI 表单 - 表单验证
jQuery EasyUI 表单 - 表单验证 本教程将向您展示如何验证一个表单.easyui 框架提供一个 validatebox 插件来验证一个表单.在本教程中,我们将创建一个联系表单,并应用 v ...
- Shell脚本字体颜色
[root@web01 scripts]# man console_codesecho -e "\033[背景颜色:字体颜色m字符串\033[0m",例:echo -e " ...