真正理解原型、原型链之间的关系

文章介绍了JavaScript中对象的概念,强调一切(引用类型)都是对象,以及如何通过new和函数创建对象。重点讨论了原型(prototype)和原型链,解释了__proto__属性如何形成原型链结构,并通过示例展示了如何通过构造函数和instanceof进行对象检测。此外,提到了Object作为所有对象的基础,以及原型继承在节省内存方面的优势和常见的继承方式。
摘要由CSDN通过智能技术生成

前言:

“一切皆为对象”
        JavaScript是一个面向(原型)对象的语言,对象是属性的集合,除了值类型 ”一切(引用类型)皆为对象“,判断一个变量是不是对象,值类型可以用typeof,引用类型用instanceof。

我们可以通过new来创建一个对象,但其实所有对象都是通过函数创建的,而函数也是对象。等等,这好像有点绕,不急,让我们先去了解prototype原型。

原型

概念:函数都有prototype属性,称之为原型,也称为原型对象。

  • 原型可以放一些属性和方法,共享给实力对象使用
  • 原型可以做继承

 原型链

概念:对象都有__proto__(隐式原型_)属性,这个属性指向它的原型对象,原型对象也是对象,也有__proto__属性,指向原型对象的原型对象,这样一层一层形成的链式结构称为原型链,最顶层找不到则返回null 。

 关系图:

function Person(name,age){
    this.name = name;
    this.age = age;
}
let person = new Person("Nicholas",18);

// 构造函数的实例指向的是构造函数的原型
console.log(person.__proto__ === Person.prototype) // true

// 构造函数可以做一些判断类的,判断是否为某个构造函数的实例
console.log(person instanceof Person) // true

// 是不是和instanceof很类似?但是不能判断更深层次的继承关系,constructor是可以被修改的,不建议使用
console.log(person.constructor === Person) // true
// constructor 指向的也是 Person
console.log(person.__proto__.constructor === Person.prototype.constructor === Person) // true

// 例如:
console.log([].constructor == Array); // true
// function Fn(){}
console.log(Fn.constructor === Function)

 

除了Function,我们还要介绍一下 Object: 

var obj = {};
console.log(obj.__proto__ === Object.prototype);  // true 

 跟函数Person是被Function创建的一样,obj本质上也是由 Object 创建的。


 

优势:节省内存,只有js才有的特性。

常用的继承方式:寄生式继承,寄生组合式继承,原型链继承,class类继承,构造函数继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值