zoukankan      html  css  js  c++  java
  • javascript对象原型及构造函数介绍

         对象是js中的一种基本的数据类型,除了可以给自身附属性外,javascript对象还可以从一个称为原型的对象继承属性。这种“原型式继承”是javascript的核心特征。

         在javascript中,创建一个对象通常可以有三个方法,对象直接量,关键字new和Object.create()函数。接下来会对这些技术稍作讲述,然后引出原型及构造函数。

         一:对象直接量

          对象直接量是一个表达式,这个表达式的每次运算都创建并初始化一个新的对象。下面有一些例子:

            var o = {};     //这个方法和var o =new Object();一样。

            var object = {'x':1,'y':2};

            var word = {'word':'hello',"sayHello":function(){}};

          二:通过new创建对象

          new运算符创建并初始化一个对象,往往后面跟着一个构造函数的调用,就像这样:

            var o = new Object(); //创建一个空对象 跟{}一样

            var a = new Array();

            var d = new Date();

    除了一些内置的构造函数以外,也可以自定义构造函数用来初始化新对象。

        function A(){     //构建的构造函数一样要求首字母大写的习惯

        };

        var a = new A();  

        三. Object.create()

        ECMAScript5定义了一个名为Object.create()的方法,它创建了一个新对象,其中第一个参数是这个对象的原型。诸如:

        var o = Object.create({'x':1,'y':2});  //o继承了属性x,y

        var o2 = Object.create(Object.prototype); //这种方法和{}及new Object()一样

     但是这个有个特殊的存在,var o1 = Object.create(null);  //o1将不继承任何属性,null不存在任何原型对象。

    进入正题

       OK,到现在介绍完了对象的创建,我们再简单解释下原型。每一个javascript对象(null除外)都和另一个对象相关联,“另一个”对象就是我们熟知的原型,每一个对象都从原型继承属性。

          所有通过对象直接量创建的对象都具有同一个原型对象(Object.prototype)。通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。就好像通过new Array ( )创建的对象的原型就是Array.prototype , 通过new Function()创建的对象的原型就是Function.prototype。通过Object.create(xx)创建的对象的原型就是其传进去的参数。

         没有原型的对象不多,null及Object.prototype都是,他们不继承属性。其他的原型对象都是普通对象,普通对象都具有原型。所有的构造函数都具有一个继承自Object.prototype的原型。举个例子,var f = new Function(); f对象的属性继承了Function.prototype,而Function.prototype又继承了Object.prototype,这一系列链接的原型对象就是所谓的“原型链”(prototype chain)。一个对象的__proto__ 属性和自己的内部属性[[Prototype]]指向一个相同的值 (通常称这个值为原型),原型的值可以是一个对象值也可以是null(比如说Object.prototype.__proto__的值就是null).

        举个例子:

        s是String构造的实例,它指向String的原型(String.prototype),String的原型指向Object.prototype,Object.prototype的原型指向null。

       接下来谈谈构造函数 

        尽管构造函数不像原型那样基础,但构造函数是类的“外在表现”。构造函数的名字通常用作类名。常见的内置构造函数有Object,Array,String,Function,Number等,任何js的函数都可以用来作为构造函数,并且调用构造函数是需要用到一个prototype属性的。这个属性是一个对象,这个对象包含唯一一个不可枚举属性constructor,constructor属性的值是一个函数。

        而且,例子中可以看到构造函数的原型中的constructor属性等于这个构造函数本身,这也就意味着对象通常继承的constructor均指代它们的构造函数。

    接下来会有一个问题。

    Function,String构造函数均是对象,它们的原型指向都是对象原型,所以它们都是Object的实例,那么,String,Function这些构造函数和Function有什么关系呢?Object instanceof Function的结果是什么呢?

    事实证明:

    解释如下:
       javascript里一切都可以当作对象来看待,构造函数本身也是对象,它们都是由Function实例化来的,它们(指的String等本身,而不是它们的原型对象)的原型指向Function.prototype.所以,它们也都是Function的实例对象。

    本文实属个人理解js的原型部分,如果有什么错误的地方,欢迎指出,拍砖~


    欢迎关注我的订阅号,每周均有本人呕心沥血之作,请多多交流,请教~~~纯属技术交流,广告党就免啦~~谢绝不走。。

  • 相关阅读:
    reids(缓存,reids下载,安装 测试)
    springboot(运行原理参考借鉴)
    springboot(整合事务和分布式事务)
    springboot(整合多数据源demo,aop,定时任务,异步方法调用,以及获取properties中自定义的变量值)
    Docker报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
    springboot整合netty,多种启动netty的方式,展现bean得多种启动方法
    im开发总结:netty的使用
    学习中常见错误码得解决方案
    内部类的使用
    Variable used in lambda expression should be final or effectively final
  • 原文地址:https://www.cnblogs.com/smallTao/p/5562881.html
Copyright © 2011-2022 走看看