首页 > 编程语言 >Javascript 原型与原型链

Javascript 原型与原型链

时间:2023-04-11 10:22:19浏览次数:56  
标签:__ proto 对象 Javascript 原型 Prototype 属性

在Brendan Eich设计Javascript时,借鉴了Self和Smalltalk这两门基于原型的语言。之所以选择基于原型的面向对象系统,是因为Brendan Eich一开始没有打算在JavaScript中加入类的概念,其设计初衷是为非专业的开发人员提供一个方便的工具,使其使用尽可能简单、易学。随着人们对网页要求的逐渐提高,对JavaScript这门语言的要求愈来愈高,开发人员也需要对这门语言有充足的了解。

中javascript中,对象的产生是通过原型对象而来的

原型的解释


原型:为其他对象提供共享属性的对象

每个对象都有一个__proto__(又名:[[Prototype]])属性, 该属性指向原型对象,并从中继承数据、结构和行为。每个函数(函数也是对象)都有一个 prototype 属性,它指向的也是一个原型对象。

这里的__proto__[[Prototype]]两个名词,在一些文章中常常混用在一起,导致难以理解,这里对两者进行解释。

__proto__译为隐式原型,又名[[Prototype]],它指向原型对象。官方 ECMAScript 规定了 prototype 是个隐式引用,但是民间浏览器开了口子,实现了一个属性 __proto__,让实例对象可以通过 __proto__ 访问其原型对象。再后来官方只好向事实低头,将 __proto__ 属性纳入规范中。至于 [[Prototype]],是在浏览器打印才显示的,它和 __proto__ 是一个含义,只是浏览器厂商换了个马甲。而且我们能在开发者工具中查看到的 [[Prototype]](或 __proto__ )是浏览器厂商故意渲染的一个虚拟节点。实际上并不存在该对象,所以 [[Prototype]] 属性既不能被 for in 遍历,也不能被 Object.key(obj) 查找出来。

查看对象的__proto__属性

const obj = {};
// target.__proto__、Object.getPrototypeOf(target)等可以访问对象的[[Prototype]]属性
console.log('obj', Object.getPrototypeOf(obj));

输出对象obj,查看其__proto__属性。

Object.getPrototypeOf(target)直接访问对象的__proto__属性

 查看函数的prototype属性

console.log('String', String.prototype);

 

 从 ECMAScript 6 开始,__proto__属性被废除(__proto__是一个访问器属性,getter 函数和setter函数),因为该属性可以这个改变对象的原型,这是一个非常慢且影响性能的操作,使用这种方式来改变和继承属性是对性能影响非常严重的。推荐使用Object.getPrototypeOf/Reflect.getPrototypeOf 和Object.setPrototypeOf/Reflect.setPrototypeOf(尽管如此,设置对象的 [[Prototype]] 是一个缓慢的操作,如果性能是一个问题,应该避免)。

小结

原型、原型对象(__proto__、[[Prototype]])、原型属性(prototype)其实是一个东西的不同称呼。当我们称呼这个东西为原型时,想表达的是它有什么作用,继承数据、结构和行为;当我们称它为原型对象时,是因为每个对象在其创建时会自带 __proto__/[[Prototype]] 属性,并指向这个对象的原型(对象);当我们称它为原型属性时,是因为每个函数都会在创建时自带 prototype 属性,而且这个属性是个指针,指向了原型对象。

 

标签:__,proto,对象,Javascript,原型,Prototype,属性
From: https://www.cnblogs.com/yoyo1216/p/17305306.html

相关文章

  • kettle从入门到精通 第十一课 kettle javascript 解析json数组
    1、json步骤虽然可以解析json数组,但是不够灵活。通过javascript步骤来解析json数组比较灵活,且可以按照需要组装数据流转到下个步骤。1)步骤名称:可以自定义2)TransformScripts:当前步骤编写的javascript脚本3)TransformConstants:重新定义的静态常量,用于控制数据行发生的情况。您必......
  • 【设计模式9】原型模式
    脑图展开一般模型具体案例(Qt,C++)定义相关类,实现个人简历的初始化和拷贝工作,其中简历的数据成员包括:姓名、性别、年龄、任职时段、任职公司,以及用于观察浅拷贝的引用(指针)成员;classICloneable{public:ICloneable();virtualICloneable*Clone()=0;//抽象的Clone方......
  • 函数声明、函数原型、函数定义
    定义”是指对函数功能的确立,包括指定函数名,函数值类型、形参类型、函数体等,它是一个完整的、独立的函数单位。而“声明”的作用则是把函数的名字、函数类型以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数......
  • JavaScript怎么实现web端上传超大文件
    ​ PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。1.file_uploads=on/off 是否允许通过http方式上传文件2.max_execution_time=30 允许脚本最大执行时间,超过这个时间就会报错3.memory_limit=50M 设置脚本可以分配的最大内存量,防止失控脚本占用过多内存,此......
  • 面向对象 之 原型继承
    搞清楚constructor构造器、prototype构造原型、实例对象三者关系constructor就是构造函数的名字,prototype是原型对象,每个构造函数都必须有一个原型对象;构造函数要被继承的方法在这里存放才不会浪费堆区空间;构造函数里面的this,无论在构造函数里,还是在原型对象里都得指向实......
  • JavaScript
    JavaScript基础JavaScript的作用:表单动态校验(密码强度检测)(JS产生最初的目的)网页特效服务端开发(Node.js)桌面程序(Electron)App(Cordova)控制硬件-物联网(Ruff).游戏开发(cocos2d-js)JS的组成ECMAScriptECMAScript是由ECMA国际(原欧洲计算机制造商协会)......
  • javaScript技巧
    一、动态修改网页内容或属性1.改变HTML内容 2.改变属性值  3.改变css样式  4.操作元素  5.定时器 ......
  • WebKit三件套(2):WebKit之JavaScriptCore/V8
    WebKit作为一个浏览器引擎,其中Javascript实现包括JavaScriptCore和V8,为了能更全面的了解WebKit,我们需要深入的了解Javascript实现的基本原理、其在WebKit中的作用以及与其他部分之间的交互,同时与Gecko中的Javacript实现作初步的对比。让我们开始了解WebKit之Javascript实现JavaScr......
  • JS引擎(1):JS引擎擂台赛,JavaScript引擎的特征比较及术语科普
    上篇介绍过JavaScript引擎的历史,《JS引擎(0):起底各种JavaScript引擎群雄争霸之路》一些流行的JavaScript引擎SpiderMonkey ,BrendanEich在Netscape创建,由C/C++语言开发,可适配ECMA-262Edition5及其之后的标准版本Rhino,由NorrisBoyd(归属Netscape)创建,则是一个Ja......
  • JS引擎(2):Java平台上JavaScript引擎—Rhino/Nashorn概述
    可以后端开发的javascript引擎有ChromeV8基于C++java的Rhino引擎(JDK6被植入),Java8被替换为NashornRhino和Nashorn都是用Java实现的JavaScript引擎。它们自身都是普通的Java程序,运行在JVM上Rhino简介Rhino[ˈraɪnəʊ]是一种使用Java语言编写的JavaScript的......