缘由

今天看到一段代码

return Object.assign(func1, func2);

心生疑惑,为什么 Object.assign 的参数可以是函数?

于是有了下面这一堆东西,其实都是老生常谈的东西,可能是岁数大了吧,有些片段都快丢失了,哈哈

prototype

js 中 万物皆是对象!!!

proto(隐式原型)与 prototype(显式原型)

对象具有属性proto,可称为隐式原型

实例(对象)的 proto === 构造(该实例)函数的 prototype

函数 Function 是特殊的对象,除了有proto外,还有自己的特有的属性 - 原型对象(prototype)

原型对象有一个属性 - constructor,指回 x.prototype 的 x(原函数)

所以 函数 还是 构造函数的函数(Function)都会指回 Object

// 特例
function aa() {}
aa.prototype; // => {constructor: ƒ} Function.prototype; // => ƒ () { [native code] } 函数也是对象哦 // 所以
Function.prototype.constructor // => ƒ Function() { [native code] } Function.prototype.constructor === Function // => true

Object.prototype 是 原型的尽头,在往上就是 null 了

看张老图吧

Objecg.assign

定义

Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象

分为两个关键点 源对象自身且可枚举的属性 和 目标对象,一个个解释

枚举

判断是否为枚举属性: Object.propertyIsEnumerable(prop)

如果判断的属性存在于 Object 对象的原型内,不管它是否可枚举都会返回 false。

总的来说,不管什么类型,只要可以用 for...in 遍历出来的属性,全都可以拷贝到 对象

例如 string 和 number:

对象

所说的对象是哪些呢?通过 instanlceof 可知(不包含全部类型)

上面是前提,下面让我们看一个 demo 吧:

function fn() {}
console.log(fn[0], fn[1], fn[2]); // => undefined undefined undefined const str = "963";
for (let k in str) {
console.log(`${k}: ${str[k]}`); // => 0: 9
// => 1: 6
// => 2: 3
} Object.assign(fn, "963"); console.log(fn[0], fn[1], fn[2]); // => 9 6 3

结果如下:

深入讲解proto 和 prototype

属性的可枚举型

js中的Object.assign接受两个函数为参数的时候会发生什么?的更多相关文章

  1. [置顶] 在js中如何实现方法重载?以及函数的参数问题

    都知道在js中没有办法直接实现方法重载,因为在js中如果定义了多个名称相同,但参数个数不一样的方法,其实只有最后一个方法能被真正调用,其他的方法都被覆盖掉了. 但每一个函数都有一个特殊的参数argum ...

  2. Js中常用的字符串,数组,函数扩展

    由于最近辞职在家,自己的时间相对多一点.所以就根据prototytpeJS的API,结合自己正在看的司徒大神的<javascript框架设计>,整理了下Js中常用一些字符串,数组,函数扩展 ...

  3. python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False。

    python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False. 重难点:定义函数的方法.使用str类型的find()函数,可以 ...

  4. js中的Object.defineProperty()和defineProperties()详解

    ECMAS-262第5版在定义只有内部采用的特性时,提供了描述了属性特征的几种属性.ECMAScript对象中目前存在的属性描述符主要有两种,数据描述符(数据属性)和存取描述符(访问器属性),数据描述 ...

  5. js中对Object对象的一些常用操作总结

    前言我前面的文章,写过js中“类”与继承的一些文章.ES5我们可以通过 构造函数 或者 Object.create()等方式来模拟出js中的“类”,当然,对象呢是类的实例化,我们可以通过如下方式创建对 ...

  6. 【JS】307- 复习 Object.assign 原理及其实现

    点击上方"前端自习课"关注,学习起来~ }let b = {    name: "muyiy",    book: {        title: " ...

  7. js中同一个onclick绑定了两个js方法出现的问题

    问题: js中如果同一个onclick绑定了两个js方法问题,即 <li onclick="f1(),f2()"></li> 两个方法f1,f2中都分别有一 ...

  8. es6中的Object.assign

    在写一些插件的时候,我们会经常遇到所传参数需要合并默认参数,并覆盖相同参数的情况,在jQuery中我们可以使用$.extend(),在原生中要想使用得自己封装, 但自从es6出现了Object.ass ...

  9. js中字符串转换为数值的两种方法的区别

    在js中字符串转换为数值的方法有三种:转换函数,强制类型转换,隐式转换 1.转换函数 parseInt()   //将字符串转换为整型 parseFloat()  //将字符串转换为浮点型 转换函数在 ...

随机推荐

  1. Java零基础入门面向对象之多态

    多态: 多态的概念:一种事物的多种形态:允许不同类的对象对同一消息做出不同的响应 多态的前提:继承,重写:向上转型(父类引用指向子类对象) 多态的作用:提高代码的可用性:降低模块之间的耦合度 多态分类 ...

  2. 5. SOFAJRaft源码分析— RheaKV中如何存放数据?

    概述 上一篇讲了RheaKV是如何进行初始化的,因为RheaKV主要是用来做KV存储的,RheaKV读写的是相当的复杂,一起写会篇幅太长,所以这一篇主要来讲一下RheaKV中如何存放数据. 我们这里使 ...

  3. OpenCV图像处理以及人脸识别

    OpenCV基础 OpenCV是一个开源的计算机视觉库.提供了很多图像处理常用的工具 批注:本文所有图片数据都在我的GitHub仓库 读取图片并显示 import numpy as np import ...

  4. nginx篇高级之优化整理

    优化思路: 一.修改连接数和工作线程让其支持更多的并发量. worker_processes 2;                    //与CPU核心数量一致 worker_connections ...

  5. MySQL集群搭建详解(三种结点分离)

    本文将搭建一个最简化的MySQL Cluster系统,配置方法中的所有命令都是以root账户运行.这个MySQL Cluster包含一个管理结点.两个数据结点.两个SQL结点,这五个结点会分别安装在五 ...

  6. Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示

    目录管理命令ls:列出指定目录下的内容格式: ls [OPTION]... [FILE]...   -a:显示所有文件包括隐藏文件   -A:显示除.和..之外的所有文件   -l,--long:显示 ...

  7. Project Euler 53: Combinatoric selections

    从12345这个数字中挑选出三个数共有十种方式: \[ 123, 124, 125, 134, 135, 145, 234, 235, 245,345 \] 在组合学中,我们将其记为\(C(5,3)= ...

  8. python入门递归之汉诺塔

    def hani(n,x,y,z): if n == 1 : print(x ,"-->",z) else: hani(n-1,x,z,y)#将n-1个盘子从x移到y pri ...

  9. 算法编程题积累(3)——腾讯笔试"构造回文“问题

    首先理解题意,回文串的特点:倒序后跟原串相同.故而可以将原串看成向一个回文串在任意位置添加任意字符后形成的字符串,也就是说原串中存在一段未必连续的回文序列. 通过分析可以知道AC本题的核心思路:求出回 ...

  10. nginx跨域解决方案

    nginx跨域解决方案Access to Font at 'http://47.104.86.187/yinjiatoupiao2/iconfont/iconfont.woff' from origi ...