JS对象与原型链
每个函数都存在一个prototype的属性,然后这个属性值为一个对象,我们称之为原型对象
每个对象都存在着一个隐藏的属性"__proto__" 这个属性引用了创建这个对象的函数的prototype
1:Object对象是由Function函数创建的
Object.__proto__ == Function.prototype 2:Object的原型对象指向空
Object.prototype.__proto__ == null 3:Function对象由他自己本身创建
Function.prototype == Function.__proto__ 4:其他的普通对象最终指向的都是Object
Function.prototype.__proto__ == Object.prototype
一:Object原型对象上面的属性
1:Constructor:保存着创建当前对象的函数; 2:hasOwnProperty(propertyName):检查属性是否在当前对象实例中,而不是在实例的原型中,且参数必须以字符串的形式指定 红 3:isPrototypeOf:测试一个对象是否存在于另一个对象的原型链上; 4:propertyIsEnumerable:某个属性是否能够使用for...in语句来枚举 5:toLocaleString:返回一个该对象的字符串表示,该字符串与执行环境的地区对应; 6:toString:返回对象的字符串表示; 7:valueOf:返回对象的字符串,数值,或者布尔值表示,通常与toString方法的返回值相同。 8:__defineGetter__: 9:__defineSetter__: 10:__lookupGetter__: 11:__lookupSetter__: 12:get __proto__: 13:set __proto__:
二:Object函数与Function本身拥有的属性
Object函数拥有的方法 1:assign() 将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象
const object2 = Object.assign({c: 4, d: 5}, object1); 2:create() 使用现有的对象来提供新创建的对象的__proto__
const person = {
isHuman: false,
printIntroduction: function () {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
}
}; const me = Object.create(person); 3:defineProperties 在一个对象上定义新的属性或修改现有属性,并返回该对象
Object.defineProperties(obj, props) 4:defineProperty 法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象
Object.defineProperty(obj, prop, descriptor) 5:entries 方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)
const object1 = { foo: 'bar', baz: 42 };
console.log(Object.entries(object1)[1]); 6:freeze 方法可以冻结一个对象 冻结指的是不能向这个对象添加新的属性,修改现有的属性
const object1 = {
property1: 42
}; const object2 = Object.freeze(object1); 7:getOwnPropertyNames 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组 8:getOwnPropertySymbols 方法返回一个给定对象自身的所有 Symbol 属性的数组 9:getPrototypeOf 方法返回指定对象的原型 10:keys 会返回一个由一个给定对象的自身可枚举属性组成的数组
1:arguments 表传入函数的实参,它是一个类数组对象
function.arguments 已经被废弃了, 现在推荐的做法是使用函数内部可用的 arguments 对象来访问函数的实参 2:caller 返回调用指定函数的函数
该属性的常用形式arguments.callee.caller替代了被废弃的 arguments.caller 3:displayName 获取函数的显示名称 4:length 指明函数的形参个数
本来应该传递的参数的个数
实际传递的:arguments.length 是函数被调用时实际传参的个数 5:name 返回函数实例的名称 6:apply 调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数
func.apply(thisArg, [argsArray]) 7:call 调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)
fun.call(thisArg, arg1, arg2, ...) 8:bind 创建一个新的函数,新函数与被调函数(绑定函数的目标函数)具有相同的函数体, 当被调用时,将其this关键字设置为提供的值
fun.bind(thisArg[, arg1[, arg2[, ...]]])
三:原型链
var obj = {}
obj.__proto__ == Object.prototype
function mySelf(){
}
var a = new mySelf()
a.__proto__ == mySelf.prototype
mySelf.prototype.__proto__ == Object.prototype
mySelf.__proto__ == Function.prototype
Object.prototype.__proto__ == null
Function.prototype.__proto__ == Object.prototype
四:对象的属性
let obj = {
name:'panrui',
age:24
}
console.log(obj)
注释:
1对象本身所拥有的属性,或者从原型链上去继承的属性
2属性当中可枚举的属性 通过for...in可遍历出来的,以及不可枚举的属性
3属性当中又分为key为Symbol的和不为Symbol的属性
五:Instanceof的判断
A Instanceof B
Instanceof的判断队则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false
isPrototypeOf:isPrototypeOf() 与 instanceof 运算符不同。在表达式 "object instanceof AFunction"中,object 的原型链是针对 AFunction.prototype 进行检查的,而不是针对 AFunction 本身
Baz.prototype.isPrototypeOf(baz) 验证baz是不是在Baz的原型链上面
似乎规则和上面的相反
JS对象与原型链的更多相关文章
- 深入理解JS对象和原型链
函数在整个js中是最复杂也是最重要的知识 一个函数中存在多面性: 1.它本身就是一个普通的函数,执行的时候形成的私有作用域(闭包),形参赋值,预解释,代码执行,执行完 成后栈内存销毁/不销毁. 2.& ...
- JS对象、原型链
忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解 js 原型,所以第一篇总结就从这里出发. 对象 JavaScript 是一种基于对象的编程语言,但它与一般面向对象的编程语言 ...
- JS对象与原型
一. JS的对象 1.1 创建对象的几种方式 1.1.1 通过字面量创建对象 在js中,一对{} 其实就是一个对象 var person = { name: "tom", age: ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
- JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链
继承:当前对象没有的属性和方法,别人有,拿来给自己用,就是继承 1 混入式继承 var I={ }; var obj = { name: 'jack', age:18, sayGoodbye : fu ...
- 1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This
参考一手资料:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/中文翻译版本:https://zhuanlan.zhihu.com/p ...
- JS面向对象之原型链
对象的原型链 只要是对象就有原型 原型也是对象 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成 ...
- 三张图较为好理解JavaScript的原型对象与原型链
最近从网上看到别人详细得讲解了js的原型对象和原型链,看完感觉是看得最清晰的一个,于是,摘录到自己博客里 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与_ ...
- javascript进阶-《原型对象和原型链》
原创发布 by @一像素 2015.12 在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象Object 和 函数对象Function. 一般而言,通过new Fun ...
随机推荐
- [luogu3380][bzoj3196]【模板】二逼平衡树【树套树】
题目地址 [洛谷传送门] 题目大意 区间查询k的排名,查找k排名的数,单点修改,区间前驱,区间后继. 感想 真的第一次写树套树,整个人都不对了.重构代码2次,发现样例都过不了,splay直接爆炸,可能 ...
- Java之函数式接口
函数式接口 概述:接口中只有一个抽象方法 下面介绍的可能很抽象,理解不了,至少在我看来单独的这几个借口是没有用的,跟最下面说的 Stream流一起用才会有效果 函数式接口,即适用于函数式编程场景的接口 ...
- Mycat的分库分表
其他方法: 雪花算法或者redis来实现id不重复的问题. 数据库分库分表: 垂直拆分的优缺点: 水平拆分: 分片枚举:即根据枚举(定义的常量)进行分类存储.
- Vue(小案例_vue+axios仿手机app)_上拉加载
---恢复内容开始--- 一.前言 ...
- 关于confluence上传文件附件预览查看时出现乱码的问题解决办法
在confluence上传excel文件,预览时发现乱码问题主要是因为再上传文件的时候一般是Windows下的文件上传,而预览的时候,是linux下的环境,由于linux下没有微软字体,所以预览的时候 ...
- 从线程池到synchronized关键字详解
线程池 BlockingQueue synchronized volatile 前段时间看了一篇关于"一名3年工作经验的程序员应该具备的技能"文章,倍受打击.很多熟悉而又陌生的知识 ...
- usb描述符简述(二)
title: usb描述符简述 tags: linux date: 2018/12/18/ 18:25:23 toc: true --- usb描述符简述 转载自cnblog 具体描述符 https: ...
- Pandas系列(十一)-文件IO操作
数据分析过程中经常需要进行读写操作,Pandas实现了很多 IO 操作的API,这里简单做了一个列举. 格式类型 数据描述 Reader Writer text CSV read_ csv to_cs ...
- python3 udp版简单的聊天器
单任务的聊天系统. 获取键盘数据,并将其发送给对方 接收数据并显示 并且功能数据进行选择以上的2个功能调用 代码实现 import socket def send_msg(udp_socket): & ...
- ST表学习笔记
ST表是一种利用DP思想求解最值的倍增算法 ST表常用于解决RMQ问题,即求解区间最值问题 接下来以求最大值为例分步讲解一下ST表的建立过程: 1.定义 f[i][j]表示[i,i+2j-1]这个长度 ...