prototype是函数的内置属性,每一个function都拥有这样一个属性,在js的面向对象编程上,prototype发挥着强大的作用。

某天,春哥问我你知道prototype的原理吗?我突然懵了,这个东西都知道干嘛用,怎么用,但是它的原理,确实不知道。为什么放在prototype里的方法不会在每次new对象的时候在这些对象分配资源来存放这些方法,却又可以直接调用这些方法呢?

先来看看使用new关键字生成对象的时候,javascript解释器做了些什么?

以 var obj = new FF(); 为例:

1,先创建一个空对象

2,把this指向这个空的对象

3,把对象的内置属性 _proto_ 指向FF的prototype属性(这时候对象的_proto_属性和这个构造函数的prototype属性,都指向了同一个对象)

4,通过this把属性和方法加在这个空对象上

5,return this指向的对象

如何验证上面所述呢?

 function DemoA(){
this.title = "this is a demo constructor";
this.f1 = function(){}
} function DemoB(){
this.title = "this is b demo constructor";
this.f2 = function(){}
}
DemoB.prototype = new DemoA(); var bDemo = new DemoB();
console.log(bDemo);

在控制台看到的结果是:

  从控制台的log可以看出,bDemo对象有个_proto_属性,它指向的是一个DemoA对象(代码中DemoB.prototype = new DemoA();),这个DemoA对象的_proto_属性指向函数DemoA的prototype(函数的默认prototype指向什么对象呢?console.log(DemoA.prototype);在控制台里打出的是DemoA{},众所周知函数本身就是一个对象,所有这里是不是涉及到了function更深层的原理呢?暂时先不去深究了),DemoA函数的prototype指向的是一个对象,它的_proto_属性指向了Object。

  那么现在也就知道了,用new构造器生成的对象,它的_proto_属性指向构造器的prototype属性所指向的对象,所有同一个构造器new出来的对象,是公用prototype里的方法和属性的。那么为什么可以像是直接调用对象的属性那样去调用prototype里的方法和属性呢?

  当我们对一个对象调用其方法时,js运行环境首先看,这个对象本身有没有这个方法,如果有就直接调用,如果没就查找这个对象的_proto_属性指向的对象(也就是该对象的构造器的prototype属性), 如果有该方法就调用,没有继续查找_proto_属性指向对象的_proto_属性指向的对象, 以此类推。这就是所谓原型链,在原型链的最末端,就是Object构造函数的prototype属性指向的那一个原型对象,这个原型上定义了一些基本的方法,如valueOf,toString等,这就像是java中的Object。

javascript的prototype原理理解的更多相关文章

  1. 我也谈javascript闭包的原理理解

    参考原文:http://www.oschina.net/question/28_41112 前言:还是一篇入门文章.Javascript中有几个非常重要的语言特性——对象.原型继承.闭包.其中闭包 对 ...

  2. 转载:Javascript面向对象编程原理 -- 理解对象

    源地址:http://www.html-js.com/article/1717 虽然JavaScript中已经自带了很多内建引用类型,你还是会很频繁的需要创建自己的对象.JavaScript编程的很大 ...

  3. Web程序员应该知道的Javascript prototype原理

    有同事问了我几个和Javascript的类继承的小问题,我在也不太理解的情况下,胡诌了一通. 回来以后有些内疚, 反省一下, 整理整理Javascript的prototype的原理, 自己清楚点, 也 ...

  4. JavaScript闭包的一些理解

    原文:JavaScript闭包的一些理解 简单一点的说:闭包就是能够读取其他函数内部变量的函数.那如何实现读取其它函数内部变量呢,大家都知道在JavaScript中内部函数可以访问其父函数中的变量,那 ...

  5. 对JavaScript中闭包的理解

    在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容.之前我对闭包的理解主要是"通过闭包可以在函数外部能访问到函数内部的变量",对闭包运用的也很少,甚至自己写过闭包自己 ...

  6. Javascript中prototype属性详解 (存)

    Javascript中prototype属性详解   在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不 ...

  7. 转:对JavaScript中闭包的理解

    关于 const     let      var  总结: 建议使用 let  ,而不使用var,如果要声明常量,则用const. ES6(ES2015)出现之前,JavaScript中声明变量只有 ...

  8. (转载)详解Javascript中prototype属性(推荐)

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  9. JavaScript异步编程原理

    众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着. ...

随机推荐

  1. brew 更换国内源(镜像)

    cd /usr/local git remote set-url origin git://mirrors.tuna.tsinghua.edu.cn/homebrew.git brew update ...

  2. C语言初学 转义字符举例

    #include<stdio.h> main() { printf("\101 \x42 C\n"); printf("I say:\"How ar ...

  3. pod应用--备用

    一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...

  4. zlog使用手册,小靠谱啊

    http://hardysimpson.github.io/zlog/UsersGuide-CN.html Chapter 1 zlog是什么? zlog是一个高可靠性.高性能.线程安全.灵活.概念清 ...

  5. repo init 时gpg: 无法检查签名:找不到公钥

    i found a solution here: http://www.marshut.com/wrrts/repo-release-1-12-4.html Sorry, I realized tod ...

  6. PlayerPrefs类

    该类用于本地持久化保存与读取数据工作原理是:以键值对的形势将数据保存在文件中.该类可以保存与读取3种基本的数据类型,它们是浮点型.整型和字符串型,涉及的方法如下.SetFloat():保存浮点类型Se ...

  7. #ifdef __cplusplus extern "C" {代码} 倒底是什么意思?

    时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus   extern "C" { #endif //一段代码 #ifdef __cplusplus } # ...

  8. logstash match

    [elk@zjtest7-frontend config]$ cat stdin04.conf input { stdin { } } filter { # drop sleep events gro ...

  9. 【转】NPAPI 插件无法在 Chrome 42 版及更高版本上正常运行

    原文网址:https://support.google.com/chrome/answer/6213033 NPAPI 插件无法在 Chrome 42 版及更高版本上正常运行 您可以利用插件在浏览器中 ...

  10. bzoj3038 上帝造题的七分钟2

    Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对 ...