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的意外修改

     

     

               

     

  • 相关阅读:
    poj 3280 Cheapest Palindrome(区间DP)
    POJ 2392 Space Elevator(多重背包)
    HDU 1285 定比赛名次(拓扑排序)
    HDU 2680 Choose the best route(最短路)
    hdu 2899 Strange fuction (三分)
    HDU 4540 威威猫系列故事――打地鼠(DP)
    HDU 3485 Count 101(递推)
    POJ 1315 Don't Get Rooked(dfs)
    脱离eclipse,手动写一个servlet
    解析xml,几种方式
  • 原文地址:https://www.cnblogs.com/hanxuming/p/5783193.html
Copyright © 2011-2022 走看看