感觉原型真是 JS 中非常复杂的一环。看 MDN 的文档某些地方也不是写的很清楚,下面写一些我对于原型的理解,如有错误望大家指出。

感觉prototype[[Prototype]]挺容易混的,看 ES 的文档时也是在看到prototype.constructor时很蒙。

根据我的经验prototype一般只有构造函数(函数)有,毕竟她可以创建对象(实例),其他对象,数组,字符串什么的没有必要有她。

所有的的对象都有自己的原型链([[Prototype]]),

她会继承(指向)其构造函数的prototype

她的构造函数的[[Prototype]]会继承(指向)其构造函数的prototype

她的构造函数的[[Prototype]]会继承(指向)其构造函数的prototype

她的构造函数的[[Prototype]]会继承(指向)其构造函数的prototype,

她的构造函数的[[Prototype]]会继承(指向)其构造函数的prototype

。。。

最终指向 null 结束。

这样就和类一样了。

prototype

对象的prototype 属性表示她的原型,该属性里面包含着可以被 “继承” 的属性。(一般只有函数自带个属性)

var foo = function(){}
foo.prototype.bar = 666; // foo对象
// {
// ...
// prototype: {
// ...
// bar: 666
// }
// }

prototype.constructor

对象的prototype 属性里面有个特殊的属性constructor ,她是指向该对象的指针(这里可能有误 T_T )。(一般只有函数自带个属性)

var foo = function(){}
foo.prototype.bar = 666; // foo对象
// {
// ...
// prototype: {
// ...
// constructor: foo,
// bar: 666
// }
// }

prototype.[[Prototype]]

对象的prototype 属性里面还有个特殊的 "属性"[[Prototype]] ,可以用来模拟继承,她指向该对象的prototype 属性的继承下来的原型(指向该对象继承的原型的prototype属性的指针)。

[[Prototype]] 也叫 prototype.__proto__

对象的构造函数的原型(指向创建该对象的函数的prototype属性的指针)。(一切对象都有这个虚拟指针)

Object.prototype.proto - JavaScript | MDN

[[Prototype]].constructor

对象的构造函数的原型的构造器(指向创建该对象的函数的prototype属性中的constructor属性的指针)。(一切对象都有这个虚拟指针)

关系对比

// Person
var Person = function (name) {
this.name = name;
this.canTalk = true;
}; Person.prototype.greet = function () {
if (this.canTalk) {
console.log('Hi, I am ' + this.name);
}
}; // Employee
var Employee = function (name, title) {
Person.call(this, name);
this.title = title;
}; // subclass extends superclass
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee; Employee.prototype.greet = function () {
if (this.canTalk) {
console.log('Hi, I am ' + this.name + ', the ' + this.title);
}
}; // instantiation
var joe = new Person('Joe');
var bob = new Employee('Bob', 'Builder');
// call function
joe.greet();
bob.greet(); // 直接打印
console.log(Person, Employee, joe, bob)
// prototype:当前对象的原型对象(实例 joe 和 bob 没有prototype)
console.log(Person.prototype, Employee.prototype, joe.prototype, bob.prototype)
// __proto__:返回当前对象构造函数的原型(代表的是 Obj.[[Prototype]])
console.log(Person.__proto__, Employee.__proto__, joe.__proto__, bob.__proto__)
// constructor:返回当前对象构造函数的引用(代表的是 Obj.[[Prototype]].constructor)
console.log(Person.constructor, Employee.constructor, joe.constructor, bob.constructor)

CSS - 架构的更多相关文章

  1. CSS架构

    CSS架构 有趣的是,我们通常不这样评判其他语言.一个Rails开发者不会因为他写的代码规范就认为他是一个好的开发者.因为这是最基本的.当然它必须是满 足规范,除此以外还要考虑其他方面:代码是否有可读 ...

  2. CSS框架分析与网站的CSS架构

    框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题,是一种可复用的构架. 我们对CSS框架这个词比较陌生,但对于JavaScript框架就比较熟悉了,比如jQuery 但为 ...

  3. css架构目标:预测,重用,扩展,维护

    请参看下面链接: CSS架构目标:预测.重用.扩展.维护

  4. CSS架构目标

    擅长CSS的Web开发人员不仅可以从视觉上复制实物原型,还可以用代码进行完美的呈现.无需使用表格.尽可能少的使用图片.如果你是个名副其实的高手,你可以快速把最新和最伟大的技术应用到你的项目中,比如媒体 ...

  5. 我的CSS架构

    写在前面 都是自己看别人的架构,自己积累下来的一些东西,这里只是阐述自己的一些观念.借此希望同行交流交流下看法,共勉. 不同架构的CSS 业务流程不同,团队配员不同.会有各种各样的CSS架构. 有的会 ...

  6. CSS架构的优选和解决方案

    背景 上周我厂前端小伙伴们开了一个技术交流会,关于如何优选CSS架构.解决掉平时写CSS时频繁出现的各种问题,这是前端人员老生常谈的问题,但却很少搬上台面,铺开正式地开交流会.这次会议,便是围绕CSS ...

  7. 20151224今天发现到的两篇关于CSS架构、可复用可维护CSS和CSS学习提升能有改变思想观念意识的文章 分别是CSS架构目标和说说CSS学习中的瓶颈

    多讲一个,CSS全称是什么?CSS全称为Cascading Style Sheets,中文翻译为“层叠样式表”,简称CSS样式表又被我们称为CSS样式,CSS样式又被作为一种能制作出各种样式网页的技术 ...

  8. html与css架构的一点体验

    css本身,可以说是一门非常简单而容易入门的语言.制作一个页面,或者制作一个小企业站,对于css的要求都是非常低的.只要熟悉语法,通过英文单词的含义猜,都基本可以拼出一套样式.更何况市面上还有各种各样 ...

  9. 通过CSS设计模式搭建自己系统的CSS架构

    theme: qklhk-chocolate 传统的CSS书写风格是随意命名,堆叠样式,造成了混乱不堪的结果,复杂页面的样式书写通常会出现几百行甚至上千行的代码,CSS设计模式在实际应用中的横空出世拯 ...

  10. Vue3 企业级优雅实战 - 组件库框架 - 4 组件库的 CSS 架构

    在前一篇文章中分享了搭建组件库的基本开发环境.创建了 foo 组件模块和组件库入口模块,本文分享组件库的样式架构设计. 1 常见的 CSS 架构模式 常见的 CSS 架构模式有很多:OOCSS.ACS ...

随机推荐

  1. P1:天文数据获取

    Step1:在sloan的casjob里http://casjobs.sdss.org/CasJobs/,密码用户 jiangbin  123456 查询满足条件的光谱对象,得到光谱对象的plate, ...

  2. 用ant打包

    Eclipse 内置了 Ant . Ant 是一种类似于批处理程序的软件包,它主要繁琐的工作是编写和调试自动处理脚本(一个 XML 文件),但只要有了这个脚本,我们就可以一键完成所有的设定工作. 本节 ...

  3. 23、GoAccess分析Nginx日志

    1.GoAccess基本概述 GoAccess是一个基于终端的快速日志分析器.其核心思想是实时快速分析和查看Web服务器统计信息. 1.安装简单: 2.操作容易: 3.界面酷炫:  2.GoAcce ...

  4. 第十篇.3、ython并发编程之多线程理论部分

    一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合 ...

  5. composer入门教程

    初始化项目 使用composer初始化工作目录,在项目的根目录命令行输入 composer init 安装项目 在composer.json文件所在目录命令行下执行如下命令 php composer. ...

  6. Single List Reversion

    LeetCode 1. 基于头插法的迭代: public ListNode reverseList(ListNode head) { if(head == null) return null; Lis ...

  7. java8学习之Stream陷阱剖析

    上一次[http://www.cnblogs.com/webor2006/p/8297603.html]在最后用stream.iterate()生成了6个奇数,接着基于它来实现如下需求:找出该流中大于 ...

  8. 并查集+启发式合并+LCA思想 || 冷战 || BZOJ 4668

    题面:bzoj炸了,以后再补发 题解: 并查集,然后对于每个点记录它与父亲节点联通的时刻 tim ,答案显然是 u 到 v 的路径上最大的 tim 值.启发式合并,把 size 小的子树往大的上并,可 ...

  9. qt打印输出到控制台

    创建工程的时候是QT Console Application 1.项目->run->Run in terminal 2.pro文件中添加  CONFIG +=console thread ...

  10. JS---client系列

    offset系列:获取元素的宽,高,left,top, offsetParent   offsetWidth:元素的宽,有边框 offsetHeight:元素的高,有边框 offsetLeft:元素距 ...