看不懂源码?先来恶补一波Object原型吧

[TOC]

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)

原文地址:https://www.cnblogs.com/failte/p/11833881.html

时间: 2024-10-25 07:50:40

看不懂源码?先来恶补一波Object原型吧的相关文章

边看MHA源码边学Perl语言之二 ManagerUtil

边看MHA源码边学Perl语言之二ManagerUtil.pm MHA版本 为了让大家有一个共同的代码学习环境,特别从网络找了mha4mysql-manager-0.56,mha4mysql-node-0.56稳定版作为学习和研究对象,大家可以到直接到github上进行clone: https://github.com/mysql-dev-fun/mha4mysql-manager-0.56 https://github.com/mysql-dev-fun/mha4mysql-node-0.56

边看MHA源码边学Perl语言之三 NodeUtil.pm

边看MHA源码边学Perl语言之三 NodeUtil.pm NodeUtil.pm源码分析 MHA的代码分为mha4mysql-manager(管理节点)和mha4mysql-node(数据库节点)两部分,可能有些人认为mha4mysql-node只需要安装在数据库节点就可以了,但通过源码可看出,在管理点节也是需要安装node节点,因为在manager节点也会调用NodeUtil中的方法.以下为加过comment的mha4mysql-node的代码: #!/usr/bin/env perl #

带着问题看redux源码

前言 作为前端状态管理器,这个比较跨时代的工具库redux有很多实现和思想值得我们思考.在深入源码之前,我们可以相关注下一些常见问题,这样带着问题去看实现,也能更加清晰的了解. 常见问题 大概看了下主要有这么几个: redux三大原则 这个可以直接参考官方文档 redux 的优缺点. 关于优缺点,太主观了大家见仁见智. redux中间件相关,洋葱模型是什么,常见中间件. 背景 有关acton,reducer相关的部分可以看我前面的文章.我们主要关注针对store和中间件相关的部分来解读. sto

jdk源码每日一读 (一) java.lang.Object

jdk源码每日一读 (一) java.lang.Object 1. 类说明 Object是java继承体系的根,是每一个类的基类,所有的类都实现了Object类的所有方法. 2.重要方法 public final native Class<?> getClass() public native int hashCode(); public boolean equals(Object obj); protected native Object clone() throws CloneNotSup

看Lucene源码必须知道的基本规则和算法

上中学的时候写作文,最喜欢的季节我都是写冬天.虽然是因为写冬天的人比较少,那时确实也是对其他季节没有什么特殊的偏好,反而一到冬天,自己皮肤会变得特别白.但是冬天啊,看到的只有四季常青盆栽:瓜栗(就是发财树,好吧,算我矫情,反正我不喜欢这个名字),绿萝,永远看不到它开花的巴西铁,富贵竹,散尾葵……过年的时候家里的杜鹃就开花了,零星的几朵小花儿更突显了这个季节的凄凉.红掌,蝴蝶兰总是美美的在那里,开不败却看不到生机.插到水里的勿忘我,洋桔梗,看到他们也只会联想到过几天他们会枯萎的命运.春天来了,先是

看Lucene源码必须知道的基本概念

终于有时间总结点Lucene,虽然是大周末的,已经感觉是对自己的奖励,毕竟只是喜欢,现在的工作中用不到的.自己看源码比较快,看英文原著的技术书也很快.都和语言有很大关系.虽然咱的技术不敢说是部门第一的,说到日语和英语,倒是无人能出其右的.额~~,一个做技术的,感觉自己好弱啊.对语言,只是天赋而已.对技术,却是痴迷.虽然有人跟我说我不做管理白瞎了我这个人儿.但是我就一心想做技术,如果到了40岁,做技术没人要的话.我就去硅谷编代码去,毕竟硅谷的同事都说我技术挺好的,相信找个技术活儿还是不成问题的.话

由自动装箱和拆箱引发我看Integer源码

背景和问题 在看别人整理的资料时,看到如下一段代码: package com.sitech.test; /** * 自动装箱和拆箱 jdk1.6 * @author liaowp * */ public class TestInteger { public static void main(String[] args) { Integer i1 = 80, i2 = 80, i3 = 999, i4 = 999; System.out.println(i1 == i2);//true Syste

android应用开发--------------看RadioGroup源码,写类似单选选项卡的集成控件(如底部导航,tab等等)

博客为 有时个哥 原创,如需转载请标明出处:http://blog.csdn.net/ls703/article/details/46694967 上面就是需求设计,4个类似的布局控件,每次只能选择一个,然后得到上面对应的钱数.(上面只是效果图,实际数据是从服务器获取,然后付到控件上) 看到这种,我们就回想到,几种实现方法. 1.把这个整体写一个布局,在xml布局中,复制粘贴,代码,凑够4个.非常不建议这样,因为4个的布局样式是一样的,只是数据可能不相同,所以我们应该写一个组合控件然后重复利用.

带着萌新看springboot源码8(spring ioc源码下)

继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了) 6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory)) 最后一步,添加一个后置处理器,打开这个后置处理器 7.initMessageSource();(主要是做国际化功能,消息绑定,emmm...不怎么了解这个) 大概的意思就是先判断容器里有没有一个id=messageSource,类型为MessageSource的组件(用于解析国际化的配置文件),有的话直接