js-原型和原型链

在学习原型和原型链的时候,我们首先要知道,数组,函数,对象都是可以自由的去拓展属性的,它们都有一个属性叫__proto__,这个属性我们一般称之为隐式原型(就是一个普通的对象);所有的函数都有一个prototype的属性,一般我们称之为显示属性(一个普通的对象);在数组,函数,对象中,他们的__proto__属性都是指向他的构造函数的prototype属性,在需要找到对象的一个属性的时候,但是在该对象中我们没要找到该对象的这个属性的时候,这个时候就会向__proto__属性中去找.

原型实例:

// 构造函数

function Person(name ,age){

      this.name = name;

      this.age = age;

}

// 因为我们可以自由的通过prototype去扩展对象的属性(null除外)

Person.prototype = {

     sayHello: function() {

       console.log('hello,我是' + this.name+',我今年'+this.age+'岁了!');

      }

      sayHi: function() {

       console.log('hi,我是' + this.name+',我今年'+this.age+'岁了!');

     }

// 当试图去找一个对象的属性时,若是对象的属性不存在,那么就会去他的构造函数的prototype属性中去找

var p1 = new Person('小明',18);

p1.sayHello();// hello,我是小明,我今年18岁了!

p1.sayHi();// hi,我是小明,我今年18岁了!

// 通过对原型的使用可以使得不比在每次创建Person对象的时候,将所有的属性都创建出来,这样可以为我们节省下很多的资源.

原型链详解:

// 若是理解了原型的话,那么对于原型链的话,理解起来也就比较简单了,首先我们是知道当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它构造函数的’prototype’属性中去寻找,因为’prototype’属性是一个对象,所以它也有一个’_ _ proto_ _'属性。

所以就会延伸出下图,原型链

p1的构造函数是Person(), 所以Person.prototype === p__proto__,Person.prototype是一个对象,它会继承跟对象Object,Object也是一个对象, Person.prototype.__proto__ === Object.prototype,Object.prototype中有toString()方法,所以我们在通过p1来调用toString()这个方法时,先去Person.prototype中去找,发现没有,然后去Object.prototype中去找,找到了,就调用Object.prototype中的toString()方法。因为Object是所有对象的父亲,所以Obj.__proto__.__proto__ === null  .这就是原型链(只能单向的从p1->object,即只能从下往上找).

理解原型链一定要先理解原型和继承,这样可以很快的知道原型链是什么了.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值