javascript---本身对原型链的小明白

1、什么是原型?

原型是函数自带的一个属性prototype,该属性的值指向一个对象 ( 由于存的是对象的指针 )。

2、原型的作用

经由过程组织函数建立的对象,能够运用原型上的属性和要领,即原型能够让实例同享它的要领和属性。

function Car(brand) { 
    this.brand = brand;
}

// 原型
Car.prototype.drive = function() {
    console.log("开车");
} 

// 建立对象(实例)
var x3 = new Car("BMW");
var glc300 = new Car("Benz");

// 两个实例都能够接见原型上的要领
x3.drive();
glc300.drive();


3、prototype

函数默许就有的属性,这个属性指向原型(原型对象)。

4、__proto__

对象默许就有的属性,这个属性也指向原型(原型对象)。

5、原型的称谓题目

prototype 这个属性, 我们称之为原型属性, 或许显现原型
.__proto__ 这个属性, 我们称之为原型对象, 或许隐式原型

6、prototype和__proto__的区分

它们两个是差别的属性

prototype是函数的属性,它存的是对象的指针,指向原型对象

函数中prototype的作用:

未来建立的实例对象的__proto__属性会依据组织函数的prototype属性来定义。

__proto__是对象的属性,它也指向原型

对象中__proto__的作用:

对象能够接见__proto__属性所指向的谁人原型对象中的属性和要领

7、constructor

一切原生的原型都有这个属性,该属性的值存的是组织函数的指针(地点)

由于组织函数.prototype 的值能够被转变,所以修正以后就不是原生原型了。

    function Car(brand) { 
        this.brand = brand;
    }

    // 原型
    Car.prototype.drive = function() {
        console.log("开车");
    } 

    // 建立对象(实例)
    var x3 = new Car("BMW");

    // 能够猎取对象的详细范例
    console.log(x3.constructor.name);    // 输出Car

    // 动态修正原型的属性, 只管不要这么干, 最好一次性在最初就定义好
    Car.prototype.drive = function() {
        console.log("飚车");
    }        

8、原型链

javascript中的对象都有一个内置的proto属性,这个属性指向建立该对象的组织函数的prototype(Fucntion.prototype-原型对象),这个原型对象也是对象,也会有自身的proto,指向它自身的原型对象,如许直到某个对象的原型为null为止,如许的一级一级的链构造就称为原型链。
《javascript---本身对原型链的小明白》

  // 实例对象f的原型 指向 原型对象F.prototype
  f.__proto__   =>   F.prototype, 
  
  // 原型对象F.prototype的原型 指向 原型对象Object.prototype
  F.prototype.__proto__   =>   Object.prototype,
  
  // 原型对象Object.prototype的原型 指向 null
  Object.prototype.__proto__   =>   null 

原型链的作用就是用来完成继续(继续:对象能够运用不属于自身的属性或许要领);
当接见一个对象的属性或许要领时,起首会在对象的自身查找,
假如没有,则依据该对象的proto属性的指向,到该对象的原型对象上查找,
假如还没有找到,就再依据原型对象的proto去查找,一直到Object.prototype为止。

举个栗子

var arr = [];
console.log(arr.hasOwnProperty('push'));                 // false
console.log(Array.hasOwnProperty('push'));               // false
console.log(Array.prototype.hasOwnProperty('push'));     // true     
console.log(arr.push === Array.prototype.push);          // true

比方我们建立一个数组, 数组arr自身是没有push要领的, push要领就是从数组的原型对象上继续而来的.

末了是一张原型 继续构造的图
《javascript---本身对原型链的小明白》

    原文作者:x1ngoo
    原文地址: https://segmentfault.com/a/1190000007111241
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞