javascript进阶-1-原型

1 原型基本概念

     Javascript 规定,每一个函数都有一个 prototype`属性,指向另一个对象。
     这个对象的所有属性和方法,都会被构造函数的实例继承。

     这也就意味着,我们可以把所有对象实例需要共享的属性和方法直接定义在 prototype对象上。

function Person (name, age) {
  this.name = name
  this.age = age
}

console.log(Person.prototype)

Person.prototype.type = 'human'

Person.prototype.sayName = function () {
  console.log(this.name)
}

var p1 = new Person(...)
var p2 = new Person(...)
//这时所有实例的 `type` 属性和 `sayName()` 方法,其实都是同一个内存地址

2 构造函数、实例、原型三者之间的关系

构造函数:构造函数就是一个函数,配合new可以新建对象。
实例:通过构造函数实例化出来的对象我们把它叫做构造函数的实例。一个构造函数可以有很多实例。
原型:每一个构造函数都有一个属性prototype,函数的prototype属性值就是原型。通过构造函数创建出来的实例能够直接使用原型上的属性和方法。


内置对象中,有很多的方法,这些方法存在哪里?

任意一个对象,都会有`__proto__`属性,这个属性指向了构造函数的prototype属性,也就是原型对象。
获取原型对象:
- 通过`构造函数.prototype`可以获取
- 通过`实例.__proto__`可以获取(隐式原型)
- 它们指向了同一个对象`构造函数.prototype === 实例.__proto__`

//`__proto__`是浏览器的一个隐藏(私有)属性,IE浏览器不支持,不要通过它来修改原型里的内容,如果要修改原型中的内容,使用构造函数.prototype去修改

3 构造函数、实例、原型三者之间的关系

任何一个对象,都有原型对象,原型对象本身又是一个对象,所以原型对象也有自己的原型对象,这样一环扣一环就形成了一个链式结构,我们把这个链式结构称为:原型链。


对象的原型链结构:
//1. var p = new Person();
//2. var o = new Object();
//3. var arr = new Array();
//4. var date = new Date();
//5. Math
//6. 查看一个div的原型链结构

总结:Object.prototype是原型链的尽头,Object.prototype的原型是null。

4 属性查找原则

     如果是获取操作
        1. 会先在自身上查找,如果没有
        2. 则根据`__proto__`对应的原型去找,如果没有
        3. 一直找到`Object.prototyp`,如果没有,那就找不到了。

    如果是修改操作:
        只会修改对象自身的属性,如果自身没有这个属性,那么就会添加这个属性,并不会修改原型中的属性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值