javascript圆形变成的基本规则:

  1. 所有数据都是对象;
  2. 要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它;
  3. 对象会记住它的原型;
  4. 如果对象无法响应某个请求,它会把这个请求委托给它自己的原型;
  • 所有的数据都是对象
  1. 在javascript的类型中,分为两类:基本类型和复杂类型;

    基本类型包括:undefined、number、boolean、string、null;基本类型可以通过包装类的方式变成对象类型数据来处理;

    复杂类型:object;

    1.1  包装对象:所谓“包装对象”,就是分别与数值、字符串、布尔值相对应的NumberStringBoolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。

    1.2  包装类和基本类型的对应关系:

基本类型 包装对象
string String
number Number
boolean Boolean
       var v1 = new Number(123);
       var v2 = new String("abc");
       var v3 = new Boolean(true);        typeof v1;//object
       typeof v2;//object
       typeof v3;//object        v1 === 123;//false
       v2 === "abc";//false
       v3 ===true;//false
    1.3 NumberStringBoolean如果不作为构造函数调用(即调用时不加new),常常用于将任意类型的值转为数值、字符串和布尔值。
     1.3.1 Boolean函数类型转换
       Boolean(undefined);//false
       Boolean(null);//false
       Boolean(0);//false
       Boolean("");//false
       Boolean(NAN);//false        Boolean(1);//true
       Boolean('false');//true
       Boolean([]);//true
       Boolean({});//true
       Booleam(function(){});//true
       Boolean(/foo/);//true

       使用双重的否运算符(!)也可以将任意值转为对应的布尔值。

        !!undefined //false

        !!null //false

        !!0 //false

        !!'' //false

        !!NAN //false

        !!1 //true

        !!'false' //false

        !![] //true

        !!{} //true

        !!function(){} //true

        !!/foo/ //true

       最后,对于一些特殊值,Boolean对象前面加不加new,会得到完全相反的结果,必须小心

     1.4 javascript中的根对象是Object.prototype对象;

        Object.prototype是一个空对象,我们遇到的每一个对象,都是从Object.prototype对象克隆而来的;

        var obj1 = new Object();

        var obj2 = {};

        console.log(Object.getPrototypeOf(obj1) === Object.prototype); //true

        console.log(Object.getPrototypeOf(obj2) === Object.prototype);//true

        ECMAScript5提供的Object.getPrototypeOf 来查看对象的原型;

  • 要得到一个对象,不是通过实例化类,而是找一个对象作为原型并克隆它

    2.1 在javascript语言里,我们并不关心克隆的细节,因为这是引擎内部实现的。我们所需要的只是显示地调用var obj = new Object()或者var obj2 = {}。此时,引擎内部会从Object.prototype上克隆一个对象出来,我们最终得到的就是这个对象。

    function Person(name){

       this.name = name;

    };

    Person.prototype.getName = function(){

      return this.name;

    };

    

    var a = new Person("seven");

    console.log(a.name);//seven

    console.log(a.getName);//seven

    console.log(Object.getPrototypeOf(a) === Person.prototype);//true

    补充解释:Person并不是类,而是构造函数,Javascript的函数既可以作为普通函数被调用,也可以作为构造器被调用。当时用new运算符来调用函数的时候,此时的函数就是一个构造器。用new运算符来创建对象的过程,实际上也只是先克隆Object.prototype对象,再进行一些其他额外操作的过程。

    2.2 _proto_属性

    2.2.1 在chrome和firefox等向外暴露了_proto_属性的浏览器下,我们可以通过下面这段代码来理解new 运算的过程

    function Person(name){

      this.name = name;

    };

    Person.prototype.getName = function(){

      return this.name;

    }

    

    var objectFactory -= function(){

      var obj = new Object(); //从Object.prototype上克隆一个空对象

      var Constructor = [].shift.call(arguments);  //call 的意思是把 空数组的方法放到arguments上执行,原来arguments是没有shift() 方法,现在是把空数组 的shift()方法放到 arguments上来执行,所以argument原来的第一个元素的值(Person)。

      obj._proto_ = Constructor.prototype;   //obj._proto_ = Person.prototype;

      var ret =Constructor.apply( obj, arguments)

      // Function.apply(obj,args)方法能接收两个参数

      // obj:这个对象将代替Function类里this对象  (这个对象继承Function里的属性和方法)

      // args:这个是数组,它将作为参数传给Function(args-->arguments)

      return typeoof ret === 'object' ? ret : obj;

    }

    var a = objectFactory(Person, 'seven');

    console.log(a.name);//seven

    console.log(a.getName());//seven

    console.log(Object.getPrototypeOf(a) === Perso.prototype); //true

  • 对象会记住它的原型

   3.1Javascript语言中的原型链查找机制,每一个对象都会记住自己的原型

  3.2 “对象的原型”,就javascript的真正实现来说,并不能说对象有原型,而只能说对象的构造器有原型,对于“对象对吧请求委托给它的原型”这句话,更好的说法是对象把请求委托给了他的构造器的原型。

   3.3 Javascript给对象提供了一个名为_proto_的隐藏属性,摸个对象的_proto_属性默认会指向它的构造函数的原型对象,即{Constructor}.prototype,在一些浏览器中,_proto_被公开出来,在chrome或者firefix上用这段代码来验证

    var a = new Object();

    console.log(a._proto_ === Object.prototype );//true

    实际上,_proto_就是对象跟“对象构造器的原型”联系起来的纽带。

  • 如果对象无法响应某个请求,他会把这个请求委托给他的构造器

Person原型对象也是对象,当这个对象找不到某个属性时,会到Object原型对象中去找,这就是原型链

  

    


 
  
 

关于对象的其他东西,请关注后续后续文章

javascript 中的原型继承的更多相关文章

  1. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  2. javascript中的原型继承

    在Javascript面向对象编程中,原型继承不仅是一个重点也是一个不容易掌握的点.在本文中,我们将对Javascript中的原型继承进行一些探索. 基本形式 我们先来看下面一段代码: <cod ...

  3. JavaScript中的原型继承原理

    在JavaScript当中,对象A如果要继承对象B的属性和方法,那么只要将对象B放到对象A的原型链上即可.而某个对象的原型链,就是由该对象开始,通过__proto__属性连接起来的一串对象.__pro ...

  4. Javascript中的原型继承具体解释

    js中的继承,是面向对象的知识,由于js没有类的概念.所以继承是通过对象实现的.谈到继承.就必须说到prototype,就不得不先说下new的过程. 一个小小的列子: <script type= ...

  5. JS中的原型继承机制

    转载 http://blog.csdn.net/niuyongjie/article/details/4810835 在学习JS的面向对象过程中,一直对constructor与prototype感到很 ...

  6. JavaScript中一个对象如何继承另外一个对象

    如题,JavaScript中一个对象a如何继承另外一个对象b.即将b中的属性和方法复制到a中去. 面试中遇到了这个问题,当时脑子里的想法是: 1.除了循环遍历复制,还能怎样 2.javascript中 ...

  7. 【转】JavaScript中的原型和继承

    请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...

  8. 深入了解JavaScript中基于原型(prototype)的继承机制

    原型 前言 继承是面向对象编程中相当重要的一个概念,它对帮助代码复用起到了很大的作用. 正文 Brendan Eich在创建JavaScript时,没有选择当时最流行的类继承机制,而是借鉴Self,用 ...

  9. 图解JavaScript中的原型链

    转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof o ...

随机推荐

  1. java,sort的数组降序

    1.Array.sort(数组,起始位置,结束位置).这个是升序排序. 2.关于数组的降序实现如下: 利用Collections.reverseOrder()方法: import java.util. ...

  2. office-excel

    Excel打印每张纸都带表头 页面布局--->打印标题--->顶端标题行

  3. springboot killed springboot 无故停止运行解决办法

    测试环境的服务部署在阿里云服务器上,运行一段时间总是自动宕掉,在配置文件里加上内存溢出配置,也不能打印出相关日志,一直找不出原因.今天在网上:http://www.cnblogs.com/chener ...

  4. vue2 商城首页轮播图切换

    home.vue <template> <div class="home"> <HomeBanner></HomeBanner> & ...

  5. 使用Github Composer Packagist编写及发布扩展包

    1.在github中创建自己的仓库,然后本地clone,初始化composer init ,在composer.json中增加autoload "autoload": { &quo ...

  6. asp.netmvc部署到linux(centos)

    介绍将asp.netmvc项目部署到centos系统. 开发工具:win10+vs2017+.NetFramework4.6.1+Vmware14+centos 1.安装Jexus 这里使用独立版(专 ...

  7. JS中的作用域(一)-详谈

    本篇文章在于详细解读JavaScript的作用域,从底层原理来解释一些常见的问题,例如变量提升.隐式创建变量等问题,在和大家一起交流进步的同时,也算对自己知识掌握的记录,方便以后复习 首先,直接捡干的 ...

  8. 福利来了,现“免费”赠送Spring微服务实战书籍

    本书适合拥有构建分布式应用程序的经验.拥有Spring的知识背景以及对学习构建基于微服务的应用程序感兴趣的Java开发人员阅读. 本书籍赠送活动详情,请识别上图二维码☝☝☝☝☝ 书籍推荐 本书教读者如 ...

  9. java按照指定格式输出系统时间使用SimpleDateFormat方法

    public class TimeThree { public static void main(String[] args) { SimpleDateFormat d = new SimpleDat ...

  10. OO第四次作业总结

    一:测试与正确性论证的效果差异 首先,测试和正确性论证都是对程序的可靠与否,是否有误进行测试,从整体上来看,测试多偏向于实践,而正确性论证则大多偏向于理论. 测试:测试首先是构造一组测试样例,之后将程 ...