zoukankan      html  css  js  c++  java
  • 《JS权威指南学习总结--6.1原型》

    内容要点:

    一.每一个JS对象(null除外)都和另一个对象相关联。"另一个"对象就是我们熟知的原型,每一个对象都从原型继承属性.

    二.所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过JS代码Object.prototype获得对原型对象的引用。

    三.通过关键字new和构造函数调用创建的对象的 原型 就是 构造函数的prototype属性 的值。(见例9-2)

    四.使用{}创建对象一样,通过new Object()创建的对象也继承自Object.prototype.

           同样,通过new Array()创建的 实例对象的原型 就是Array.prototype, (Array,Date等都是JS内部构造函数)

                   通过new Date()创建的 实例对象的原型 就是Date.prototype.

    五.

       没有原型的对象为数不多,Object.prototype就是其中之一。它不继承任何属性。其他原型对象都是普通对象,普通对象都具有原型。

       所有的内置构造函数(以及大部分自定义的构造函数)都具有一个继承自Object.prototype的原型。

        例如:

           Date.prototype的属性继承自Object.prototype,因此new Date()创建的Date对象的属性同时继承自Date.prototype和Object.prototype.

           这一系列链接的原型对象就是所谓的"原型链"。

    六.Object.create()

         1.ECMAScript5定义了一个名为Object.create()的方法,它创建了一个新对象,其中第一个参数是这个对象的原型。Object.create()提供第二个可选参数,用以对对象的属性进行进一步描述.

         2.

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

              var o2=Object.create(null); //o2不继承任何属性和方法

              var o3=Object.create(Object.prototype); //o3和{}和new Object()一样 可以通过任意原型创建新对象(换句话说,可以使任意对象可继承);

          3.通过原型继承创建一个新对象

               //inherit()返回了一个继承自原型对象p的属性的新对象

               //这里使用ECMAScript 5中的Object.create()函数(如果存在的话)

              //如果不存在Object.create(),则退化使用其他方法

                function inherit(p){

                    if(p==null) throw TypeError(); //p是一个对象,不能为null

                    if(Object.create)                  //如果Object.create()存在,直接使用它,否则进一步检测

                        return Object.create(p);

                    var t=typeof p;

                    if(t!=="object" && t!=="function") throw TypeError();

                    function f(){};  //定义一个空构造函数

                    f.prototype=p;  //将其原型属性设置为p

                    return new f();  //使用f()创建p的继承对象

              }     

         inherit()函数的其中一个用途就是防止库函数无意间(非恶意地)修改那些不受你控制的对象。

                     不是将对象直接作为参数传入函数,而是将它的继承对象传入函数。

                     当函数读取继承对象的属性时,实际上读取的是继承来的值。

                     如果给继承对象的属性赋值,则这些属性只会影响这个继承对象自身,而不是原始对象。

                    var o={x : "don't change this value"};

                    library_function(inherit(o));  //防止对o的意外修改

     

     

               

     

  • 相关阅读:
    centos 修改语言、时区
    去除 ufeff
    Docker介绍及使用
    消息队列
    数据结构与算法
    Haystack
    Python面向对象之魔术方法
    关于Redis处理高并发
    Redis
    RESTful规范
  • 原文地址:https://www.cnblogs.com/hanxuming/p/5783193.html
Copyright © 2011-2022 走看看