Object.create方法与原型链

"本文讲解了Object.create()方法的用途,展示了如何创建新对象并指定原型,比较了传入对象和函数作为参数的区别,并剖析了原型链的工作原理。重点讨论了Object.create(null)和{}
摘要由CSDN通过智能技术生成

一. 前言

Object.create()方法的作用:创建一个新对象,使用现有的对象来提供新创建的对象的__proto__(会返回一个新对象,带着指定的原型对象和属性)

二. Object.create解析

// 首先自定义一个构造函数并初始化一个实例对象。
function Base(){
    this.name = 'cuixiaodao'
}
Base.prototype.say = function (){
    console.log(`1:`,1);
}

var base = new Base();


// 创建新对象,指定其隐式原型为Base
var o1 = Object.create(Base);
o1.__proto__ === Base; // true

// 创建新对象,指定其隐式原型为base
var o2 = Object.create(base);
o2.__proto__ === base; // true

默认情况下,js中对象的隐式原型__proto__指向其构造函数的显示原型prototype(这里的指向可以理解为属性与值的关系)

而经过Object.create()方法创建的对象可以指定其隐式原型为一个函数或者对象

三. Object.create()参数为对象和函数的区别

function Base() {
    this.name = 'cuixiaodao'
}
Base.age = '18';
Base.prototype.say = function () {
    console.log(`1:`, 1);
}

let base = new Base();

let o1 = Object.create(Base);
var o2 = Object.create(base);
console.log(`o1:`,o1);
console.log(`o2:`,o2);

可以看到o1的隐式原型是Base,而o2隐式原型是base

o2可以访问到base上的name属性及base通过__proto__继承来的say方法。

o2.name;  // cuixiaodao
o2.say(); // 1

但是o1都访问不到

o1.name;  // 'Base'
o1.say;  // undefined

主要是因为原型链继承是通过对象的__proto__属性实现的:访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。虽然o1.proto === Base,但由于say方法是定义在Base原型上的,通过o1.__proto__并访问不到,所以是undefined。直接在Base上面定义属性,o1是可以访问到的。

四. Object.crete(null)和{}

Object.crete(null)会返回一个纯净的对象,不会继承内置Object的toString、valueof等方法。
在这里插入图片描述

五. 原型链

构造函数的prototype和其实例的__proto__是指向同一个地方的,这个地方就叫做原型对象

在这里插入图片描述

Function和Object

Function.prototype === Object.proto

Function.prototype === Function.proto

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值