感觉原型真是 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. 使用GDB和GEF进行调试

    使用GDB进行调试 这是编译ARM二进制文件和使用GDB进行基本调试的简单介绍.在您按照教程进行操作时,您可能需要按照自己的习惯使用ARM程序集.在这种情况下,你要么需要一个备用的ARM设备,或者你只 ...

  2. php+ajax远程加载避免重复提交

    近日在练习签到送积分功能时,发现可以在一瞬间的时候提交好多次 导致可以重复领取多次积分 除了增加请求限制之外 发现ajax提交没有限制重复提交 遂立此贴为警示 首先上表单代码 <form ons ...

  3. PyCharm上unittest 测试用例两种执行方式

    每次讲到unittest测试框架的时候,经常有同学在群里反映,为啥我的运行不是按照我往suite里添加的用例顺序执行的,为什么别人的能跑出来报告,我的就不行... 当然,首先确认代码是OK的,如果代码 ...

  4. Java语言基础(2)

    1 包的概念 把一个项目分割成几个模块,为每一个模块建立包,把该模块的.java文件统一放到对应包,通过包更好的管理.java文件,并且更好的分工合作.可以尽量避免出现.java文件重名现象. 包命名 ...

  5. ZenCart通过Contact Us接收垃圾邮件的过滤方案

    最近收到一些通过Contact Us进行垃圾外链群发的邮件,虽然可以通过在Contact Us增加验证码来解决,但不利于客户体验.所以我们可以通过简单的关键词过滤来实现,一般垃圾外链都含有“[url= ...

  6. 【HDU6703】array

    题目大意:给定一个 N 个数字的排列,需要支持两种操作:对某个位置的数字 + 1e7,查询区间 [1, r] 中最小的不等于区间中任何一个数字的数. 题解:本题证明了对于 50W 的数据来说,\(O( ...

  7. jdk8流list转Map

    /** * */ package com.chuanglan.demo; import java.util.ArrayList; import java.util.Arrays; import jav ...

  8. Python CGI编程Ⅵ

    GET和POST方法 浏览器客户端通过两种方法向服务器传递信息,这两种方法就是 GET 方法和 POST 方法. 使用GET方法传输数据 GET方法发送编码后的用户信息到服务端,数据信息包含在请求页面 ...

  9. JSONArray排序和倒转

    JSONArray排序 // JSONArray转list List<JSONObject> list = JSONArray.parseArray(ordersDataArray.toJ ...

  10. socket 异步 发送 接收 数据

    Socket socketClints = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); / ...