看不懂源码?先来恶补一波Object原型吧
- Object
- Object属性
- Object方法
- 1、Object.assign()
- 2、Object.create()
- 3、Object.seal()
- 4、Object.freeze()
- 5、Object.is()
- 6、Object.preventExtensions()
- 7、Object.getOwnPropertyNames()
- 8、obj.hasOwnProperty()
- 9、Object.getOwnPropertyDescriptor()
- 10、Object.getOwnPropertyDescriptors()
- 11、Object.getOwnPropertySymbols()
- 12、Object.defineProperties()
- 13、Object.values()
- 14、Object.entries()
- 15、Object.fromEntries()
- 16、Object.getPrototypeOf()
- 17、Object.setPrototypeOf()
- 18、Object.toString()
- 原型方法
Object
Object是一种引用数据类型,也是一个构造函数。
Object属性
1、Object.prototype
Object的原型。
Object原型处于原型链的顶端,是所有对象的原型。
2、Object.name
返回Object函数名。
Object方法
1、Object.assign()
将两个对象合并,并返回新的对象。
在产生冲突时,后者的属性会覆盖前者。
该方法属于浅拷贝。
var target={name: "failte", age: 18};
var source={sex: "man", age: 22};
var obj = Object.assign(target, source);
2、Object.create()
以对象原型,创建一个新对象。
第一个参数为原型对象,第二个参数为新描述符属性对象。
var obj = {
this.a="a";
this.b="b"
};
var nobj = Object.create(obj, {
name: {
value: 42,
writable: true,
enumerable: true,
configurable: true
}
});
3、Object.seal()
封装对象。封装后的对象无法增删属性,但可以修改属性。
可以通过Object.isSealed()方法判断对象是否被封装。
var obj = {a: 1};
Object.seal(obj);
obj.b = 'el';
delete obj.a;
console.log(obj);
4、Object.freeze()
冻结对象。被冻结的对象增删改属性。
返回和传入的参数是同一对象。
可以使用Object.isFrozen()方法判断对象是否被冻结。
var obj = {a: 1};
Object.freeze(obj);
obj.b = 2;
delete obj.a;
obj.a = 10;
console.log(obj);
5、Object.is()
判断两个对象是否相同。
比较两方为 undefined、null、true、false、相同字符串、同一对象、NaN、+0、0、-0、数字时,返回true,其他情况返回false。
var obj = {a: 1, b: 2};
console.log(Object.is(undefined, undefined));
console.log(Object.is(null, null));
console.log(Object.is(true, true));
console.log(Object.is(false, false));
console.log(Object.is('aaa', 'aaa'));
console.log(Object.is(obj, obj));
console.log(Object.is(NaN, NaN));
console.log(Object.is(-0, -0));
console.log(Object.is(+0, +0));
console.log(Object.is(0, 0));
console.log(Object.is(100, 100));
6、Object.preventExtensions()
限制对象不可扩展。
可以通过Object.isExtensible()判断对象是否被限制。
var obj = {a: 1, b: 2};
Object.preventExtensions(obj);
obj.c = 3;
console.log(obj);
7、Object.getOwnPropertyNames()
返回对象可以遍历的属性的键名数组。
ES6的简洁写法为:Object.keys(obj)
var obj = {a: 1, b: 2};
console.log(Object.keys(obj));
8、obj.hasOwnProperty()
判断对象是否存在属性
ES6简洁写法:key in obj
var obj = {a: 1, b: 2};
console.log(obj.hasOwnProperty('a')); // ES5
console.log('a' in obj); //ES6
9、Object.getOwnPropertyDescriptor()
查询对象属性的描述符。
var obj = {a: 1, b: 2};
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
10、Object.getOwnPropertyDescriptors()
查询对象的描述符。
var obj = {a: 1, b: 2};
console.log(Object.getOwnPropertyDescriptors(obj));
11、Object.getOwnPropertySymbols()
返回对象所有的Symbol值属性键名数组。
var obj = {a: 1, b: 2, [Symbol('a')]: 3};
console.log(Object.getOwnPropertySymbols(obj));
12、Object.defineProperties()
定义对象属性。
var obj = {};
Object.defineProperties(obj, "val", {
value: undefined, // 属性值,默认undefined
writable: false, // 是否可写,默认false
enumerable: false, // 是否可枚举,默认false
configurable: false, // 是否可配置,默认false
get: undefined, // 该属性的getter,默认undefined
set: undefined, // 该属性的setter,默认undefined
})
13、Object.values()
返回对象所有的属性值数组。
var obj = {a: 1, b: 2};
console.log(Object.values(obj));
14、Object.entries()
返回对象所有属性与属性值的键值对列表。
var obj = {a: 1, b: 2};
console.log(Object.entries(obj));
15、Object.fromEntries()
把键值对列表转换为一个对象。与Object.entries()方法相反。
var obj = {a: 1, b: 2};
var entries = Object.entries(obj);
console.log(Object.fromEntries(entries));
16、Object.getPrototypeOf()
获取对象的原型。相当于直接获取obj.prototype。
var obj = {a: 1, b: 2};
console.log(Object.getPrototypeOf(obj));
17、Object.setPrototypeOf()
设置对象的原型。相当于直接设置obj.prototype。
function Animal() {
this.a = 1;
this.b = 2;
}
var obj = {};
Object.setPrototypeOf(obj, new Animal());
console.log(obj.a);
18、Object.toString()
原型方法
1、apply()
可以修改this的指向,执行并返回改变指向后的函数的运行结果。
原函数的传参以数组的方式传入。
2、arguments
返回当前函数的实参列表。
get/set
3、bind()
可以修改this的指向,返回改变指向后的函数。
4、call()
可以修改this的指向,执行并返回改变指向后的函数的运行结果。
原函数的传参以多个参数的的方式传入。
get/set
5、caller()
返回函数的调用环境。
6、constructor()
返回当前对象的构造函数。
7、length
返回当前函数的形参个数。
8、name
返回当前对象的名称。
9、toString()
返回当前对象的字符串形式。
10、Symbol.hasInstance
判断某对象是否为某构造器的实例。
用它自定义instanceof操作符在某个类上的行为。
获取Function原型的instanceof对应的方法
var func = () => {};
var obj = {};
var log1 = Function[Symbol.hasInstance](func, Function);
var log2 = Object[Symbol.hasInstance](obj, Object);
console.log(log1, log2)
自定义类,并重写instanceof方法
class My {
[Symbol.hasInstance](instance) {
console.log(instance)
return true;
}
constructor() {
this.a=1
}
}
var my = new My()
console.log(my instanceof My)
看不懂源码?先来恶补一波Object原型吧的更多相关文章
- 学不懂Netty?看不懂源码?不存在的,这篇文章手把手带你阅读Netty源码!
阅读这篇文章之前,建议先阅读和这篇文章关联的内容. 1. 详细剖析分布式微服务架构下网络通信的底层实现原理(图解) 2. (年薪60W的技巧)工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...
- 还看不懂同事代码?快来补一波 Java 7 语法特性
前言 Java 平台自出现到目前为止,已经 20 多个年头了,这 20 多年间 Java 也一直作为最流行的程序设计语言之一,不断面临着其他新兴编程语言的挑战与冲击.Java 语言是一种静态强类型语言 ...
- 一点一点看JDK源码(〇)
一点一点看JDK源码(〇) liuyuhang原创,未经允许进制转载 写在前面: 几乎所有的大神都会强调看源码,也强调源码的重要性: 但是如何看源码,源码看什么?看了什么用?看了怎么用? 困扰很多人, ...
- 一点一点看JDK源码(三)java.util.ArrayList 前偏
一点一点看JDK源码(三)java.util.ArrayList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 ArrayLi ...
- 【实习记】2014-08-15文档太少看着源码用cgicc+stl库之模板谓词函数对象
总结1: 今天找到了昨天scanf的问题答案,scanf与printf一样的神奇而复杂,稍不留神,就会被坑.scanf函数在读入非空白符分割的多个字符串的解决方法是这个:/* 以 | 分割 * ...
- 边看MHA源码边学Perl语言之一开篇
边看MHA源码边学Perl语言之一开篇 自我简介 先简单介绍一下自己,到目前为此我已经做了7年左右的JAVA和3年左右php开发与管理,做java时主要开发物流行业的相关软件,对台湾快递,国际快递,国 ...
- 带着萌新看springboot源码8(spring ioc源码 完)
上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...
- 一点一点看JDK源码(一)Collection体系概览
一点一点看JDK源码(一)Collection体系概览 liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 Collection为集 ...
- 一点一点看JDK源码(二)java.util.List
一点一点看JDK源码(二)java.util.List liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 List译为表,一览表, ...
随机推荐
- centos GIT安装
[注](yum 源仓库里的 Git 版本更新不及时,最新版本的 Git 是 1.8.3.1,但是官方最新版本已经到了 2.9.2.想要安装最新版本的的 Git,只能下载源码进行安装.) 安装git服务 ...
- django允许外部访问 项目后台不挂断运行
1关闭防火墙 1 service iptables stop 2设置django 1 2 3 4 5 6 7 8 9 10 11 开开启django时,使用0.0.0.0:xxxx,作为ip和端口例如 ...
- SCM
scm即软件配置管理. 软件配置管理(SCM)是指通过执行版本控制.变更控制的规程,以及使用合适的配置管理软件,来保证所有配置项的完整性和可跟踪性,配置管理是对工作成果的一种有效保护. SCM(Sof ...
- TCP和UDP的区别,以及它们对应的协议有哪些?
TCP(传输控制协议) 是面向连接的协议.在收发数据前,一个TCP连接必须要经过“三次握手”建立可靠的连接.握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据.理想状态下 ...
- sd卡无法启动及zc706更改主频后可以进入uboot无法启动kernel的坑
好长的标题 +_+ 1.sd卡无法启动 起因:kernel底下通过dd测试速度,擦写了sd卡,再启动时发现无法启动 于是重新格式化,再将BOOT.bin 相关dtb u-rootfs zImage和u ...
- 前端每日实战:49# 视频演示如何用纯 CSS 创作一支诱人的冰棍
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/vrxzMw 可交互视频教程 此视频 ...
- 全球的IPv6部署急剧增加,但中国几乎没有一个地方部署?
全球的IPv6部署继续增加,但中国在IPv6方面还需要努力,从部署图上分析,中国几乎没有几个地方是普及IPv6的.这6年来,自世界IPv6发布以来,全球网络和服务提供商的IPv6部署水平急剧增加.如图 ...
- toj 4602 松鼠聚会
题目: 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示,两个点的距离定义为:点( ...
- java中switch的用法以及判断的类型有哪些(String\byte\short\int\char\枚举类型)
switch关键字对于多数java学习者来说并不陌生,由于笔试和面试经常会问到它的用法,这里做了一个简单的总结: 能用于switch判断的类型有:byte.short.int.char(JDK1.6) ...
- uwsgi部署django项目
一.更新系统软件包 yum update -y 二.安装软件管理包及依赖 yum -y groupinstall "Development tools" yum install o ...