原型和原型链

原型链和原型

构造函数或构造器具有prototype属性,对象具有_ proto _ _属性 这就是之前学的原型。如果构造函数或对象A,A的原型指向构造函数B或对象B,B的原型再指向构造函数或对象C,以此类推,最终的构造函数或对象的原型指向Object的原型。由此形成一条链状结构,被称之为原型链

按照上述的描述,在B中定义的属性或方法,可以直接在A中使用并不需要定义。这就是继承,它允许每个对象来访问其他原型链上的任何属性或方法。

为了更好的帮助大家理解记忆原型链的结构,以下是我所学到的代码,希望可以帮到大家。

// 原型链
function A(){
    this.a = 'a';
}
// 通过构造函数创建对象
var a = new A();

function B(){
    this.b = 'b';
}
// 将B的原型指向对象a
B.prototype = a;
// 通过构造函数创建对象
var b = new B();

console.log(b.b);// b
console.log(b.a);// a

function C(){
    this.c = 'c';
}
// 将C的原型指向对象b
C.prototype = b;
// 通过构造函数创建对象
var c = new C();

console.log(c.c);// c
console.log(c.b);// b
console.log(c.a);// a

原型链是ECMAScript标准中指定的默认实现继承的方式。

原型的概念
在JavaScript中,函数是一个包含属性和方法的Function类型的对象。而原型就是Function类型对象的一个属性。

在函数定义时就包含了prototype属性,他的初始值是一个空对象。在JavaScript中并没有定义函数的原型类型,所以原型可以是任何类型。

原型是用于保存对象的共享属性和方法的,原型的属性和方法并不会映像函数本身的属性和方法。

function foo(a,b){
    return a + b;
}
console.log(typeof foo.prototype);//object

获取原型

通过如下两种方式可以获取对象的原型,从而设置共享的属性和方法:

  • 通过构造函数的prototype属性。

    function Person(){
        console.log('Person instantiated');
    }
    console.log(Person.prototype);
    
  • 通过Object对象的getPrototypeOf(obj)方法。

原型的属性和方法

通过如下两种方式可以设置原型的属性和方法:

  • 原型的属性和方法单独进行定义。

    构造函数.prototype.属性名=属性值;
    构造函数.prototype.方法名=function(){}
    
  • 直接为原型定义一个新对象。

    构造函数:prototype={
      属性名:属性值,
      方法名:function(){}
    }
    

    检测自由属性或原型属性

prototype

在JavaScript中,每个函数都有一个prototype属性,这个属性指向函数的原型对象。

原型的概念:每一个javascript对象(除null外)创建的时候,就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型中“继承”属性。
在这里插入图片描述
__proto__属性

function Hero(){}
Hero.prototype={
    name:"Mary";
    salary:3800
}
var hero = new Hero();
console.log(hero.name);//Mary

这是每个对象(除null外)都会有的属性,叫做__proto__,这个属性会指向该对象的原型。
需要注意的是:_ _ proto_ _ 属性与prototype属性并不等价。_ _ proto_ _ 属性属性只能在调试时使用。

  • _ _ proto_ _ 属性是指定对象的属性。

  • prototype属性是指定构造函数的属性。

原型对象就是通过 Object 构造函数生成的,结合之前所讲,实例的 proto 指向构造函数的 prototype ,这是它们之间的一个关系图:
在这里插入图片描述

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页