如何使用JavaScript进阶(四)原型与原型链

  介绍

小编这次要给大家分享的是如何使用JavaScript进阶(四)原型与原型链,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。

一句话说明什么是原型:原型就是一个JavaScript对象,原型能存储我们的方法,构造函数创建出来的实例对象能够引用原型中的方法。

一、传统构造函数的问题

有如下代码

函数Foo () {
  这一点。sayHello=function () {
  }
  }

由于对象是调用<代码>新Foo() 所创建出来的,因此每一个对象在创建的时候,函数sayHello都会呗创建一次

那么有没一个对象都含有一个独立的,不同的,但是功能逻辑一样的函数,比如:<代码>{}=={}

在代码中方法就会消耗性能,最典型的资源就越是内存

这里最好的方法就是将函数放在构造函数之外,那么在构造函数中引用该函数即可

函数sayHello () {}
  函数Foo () {
  这一点。说=sayHello;
  }

会在开发中变得困难:引入框架危险,代码繁冗不好维护。解决方法就是如果外面的函数不占用其名字,而且在函数名下。

每一个函数在定义的时候,有一个神秘对象(就是原型对象,暂且这么称呼)被创建出来。

每一个由构造函数创建的对象都会默认的连接到该神秘对象上。

函数Foo () {}
  Foo.prototype。sayHello=function () {
  console.log (“…!”);
  }
  var f1=new Foo ();
  f1.sayHello ();
  var f2=new Foo ();
  f2.sayHello ();
  console.log (f1。sayHello===f2.sayHello);//真正的

二,一些相关概念

<强> 类类:在JS中就是构造函数

    <李>在传统的面向对象语言中,使用一个叫类的东西定义模板,然后使用模板创建对象。 <李>在构造方法中也具有类似的功能,因此也称其为类

<强>实例(实例)与对象(对象)

    <李>实例一般是指某一个构造函数创建出来的对象,我们称为XXXX构造函数的实例 <李>实例就是对象。对象是一个泛称李 <李>实例与对象是一个近义词

<强>键值对与属性和方法

    <李>在JS中键值对的集合称为对象李 <>李如果值为数据(非函数),就称该键值对为属性李 <>李如果值为函数(方法),就称该键值对为方法方法

<强>父类与子类(基类和派生类)

    <李>传统的面向对象语言中使用类来实现继承那么就有父类,子类的概念 <李>父类又称为基类,子类又称为派生类李 <>李在JS中没有类的概念,在JS中常常称为父对象,子对象,基对象,派生对象。

三,认识原型

在JavaScript中,<强>原型也是一个对象,通过原型可以实现对象的属性继承强,JavaScript的对象中都包含了一个<代码>[[原型]]>

[[原型]]作为对象的内部属性,是不能被直接访问的,所以为了方便查看一个对象的原型,Firefox和Chrome中提供了<代码> __proto__ 这个<强>非标准(不是所有浏览器都支持)的访问器(ECMA引入了标准对象原型访问器“Object.getPrototype(对象)“)。

下面通过一个例子来看看原型相关概念:

函数//神秘对象就是Person.prototype//那么只有使用构造函数才可以访问它
  var o=新人();//以前不能直接使用o来访问神秘对象//现在有了__proto__后,
  o.__proto__也可以直接访问神秘对象//那么o。__proto__===人。原型

<>强神秘对象(原型)中都有一个属性构造函数<代码>

<代码> __proto__>

如果在早期的浏览器中使用实例需要访问原型如何处理?可以使用实例对象访问构造器,然后使用构造器访问原型

 var o=新人();
  o.constructor。

如何使用JavaScript进阶(四)原型与原型链