js语言的原型知识总结(包含new操作符原理,继承实现)

1.原型和原型链的概念

js在创建一个对象时,比如叫 obj,都会给他偷偷的加上一个引用,这个引用指向的是一个对象,比如叫 yuanxing
这个对象可以给引用它的对象提供属性共享,比如:yuanxing上有个属性name,可以被 obj.name访问到,
这个可以提供属性共享的对象,就称为前面对象的原型

而原型本身也是一个对象,所以它也会有一个自己的原型,这一层一层的延续下去,直到最后指向 null,这就形成的 原型链

那js的这一种是原型机制是怎么实现的呢?

2.原型的实现

我们先从一个例子来看:

//code-01
let obj = new Object({
   name:'xiaomin'})
console.log(obj.name)
console.log(obj.toString())

// xiaomin
// [object Object]

我们首先创建了一个对象obj,它有一个属性name
属性name是我们创建的,但是在创建obj的时候,并没有给它创建toString属性,为什么obj.toString()可以访问的到呢?

prototype 属性
我们先来看一下Object.prototype属性

我们发现这里有toString属性,所以其实Object.prototype就是obj的原型,按照原型的概念,它能够为obj提供属性共享
所以当obj.toString()的时候,先在obj的属性里找,没找到,就在obj的原型Object.prototype的属性上找,可以找到,所以调用成功

proto 属性
那么obj是怎么找到原型的呢?我们打印obj属性看一下:

我们发现obj除了我们创建的name以外,还有一个__proto__属性,它的值是一个对象,那么它等于什么呢?

我们发现obj.__proto__指向的就是Object.prototype

到此为止,我们可以简单总结一下js语言实现原型的基本机制了

  • 在创建一个对象obj时,会给它加上一个__proto__属性
  • __proto__属性 指向obj构造函数prototype对象
  • 当访问obj的某个属性时,会先在它自己的属性上找,如果没找到,就在它的原型(其实就是__proto__指向的对象)的属性上找

构造函数
这个有一个构造函数的概念,其实构造函数也就是普通函数,当这个函数被用来 new一个新对象时,它就被称为新对象的 构造函数
就上面的例子而言,Objec就是obj的构造函数,
这里要区别一下Objectobject的区别,前者是一个js内置的一个函数,后者是js的基本数据类型(number,string,function,object,undefined)

3.new 实际上做了什么

上面有说到new关键字,那么在它实际上做了什么呢?
上面代码code-01使用系统内置的函数Object来创建对象的,那么我们现在用自己创建的函数来创建一个新对象看看:

//code-02

function human(name){
   
  this.name = name
}
human.prototype.say = function(){
   
  alert('我叫'+this.name)
}
let xiaomin = new human('xiaoming')

console.log(xiaomin.name)
xiaomin.say()

这里的human就是新对象xiaoming的构造函数
我们把新创建的对象xiaoming打印出来看看:

我们看到xiaoming有一个属性name,并且xiaoming.__proto__完全等于构造函数的human.prototype,这就是它的原型
从这里我们可以总结一下new的基本功能:

  • 构造函数的this指向新创建的对象xiaoming
  • 为新对象创建原型,其实就是把新对象的__proto__指向构造函数的prototype

手写new
上面我们了解了new具体做了什么事情,那么它是怎么实现这些功能的呢?下面我们手写一个函数myNew来模拟一下new的效果:

//code-03
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值