JavaScript原生オブジェクト及び拡張


オブジェクトと元のオブジェクトを内蔵
内蔵(Build-in)オブジェクトと原生(Naitve)オブジェクトの違いは、前者は常にエンジン初期化段階で作成されたオブジェクトであり、後者のサブセットである.後者は、実行中に動的に作成されたいくつかのオブジェクトを含む.
元のオブジェクト(New以降のオブジェクト)ECMA-262は、元のオブジェクト(native object)を「宿主環境から独立したECMAScriptが提供を実現するオブジェクト」と定義している.以下を含む:
Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError、ActiveXObject(     )、Enumerator(     )、RegExp(     )
これにより、簡単に言えば、元のオブジェクトはECMA-262によって定義されたクラス(参照の種類)であることがわかる.
ソース:http://es5.github.com/#x4.3.6
内蔵オブジェクト(Newは不要)
定義:ECMAScriptによって提供されるオブジェクトは、宿主環境とは独立して、スクリプトプログラムの実行の開始点にあります.
注:各内蔵オブジェクト(built-in object)は、元のオブジェクト(Native Object)であり、内蔵された構造関数は、内蔵されたオブジェクトであり、構造関数でもある.
ソース:http://es5.github.io/#x4.3.7
くりを一つあげる:
Native objects: Object (constructor), Date, Math, parseInt, eval。 string      indexOf   replace, array   , ...

Host objects (        ): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ...
ECMA-622)[2は、新しい2つの内蔵オブジェクト、すなわちGlobalMathを定義しています.それらは元のオブジェクトです.定義により、各内蔵オブジェクトは元のオブジェクトです.]
ECMA-622で定義されている内蔵オブジェクト(built-in)は以下の通りです.
global、Object、Function、Array、String、Boolean、Number、Math、Date、RegExp、JSON、Error  (Error,   EvalError, RangeError, ReferenceError,   SyntaxError, TypeError  URIError)
内蔵オブジェクトの原型も修正できます.
if (!Array.prototype.forEach) { 
  Array.prototype.forEach = function(fn){ 
    for ( var i = 0; i < this.length; i++ ) { 
      fn( this[i], i, this ); 
    } 
  }; 
} 
 
["a", "b", "c"].forEach(function(value, index, array){ 
  assert( value, "Is in position " + index + " out of " + (array.length - 1) ); 
});
以上のコードは出力されます.
PASS Is in position 0 out of 2
PASS Is in position 1 out of 2
PASS Is in position 2 out of 2  
注意:原型を広げるのは危険です.
Object.prototype.keys = function(){ 
  var keys = []; 
  for ( var i in this ) 
    keys.push( i ); 
  return keys; 
}; 
 
var obj = { a: 1, b: 2, c: 3 }; 
 
assert( obj.keys().length == 3, "We should only have 3 properties." ); 
 
delete Object.prototype.keys;
出力:FAIL We should only have 3 properties.特別な必要がなければ、原生オブジェクトと原型(prototype)を拡張するのはよくないです.
//      
Array.prototype.map = function() { 
    // code 
}; 
このようにしない限り、例えばいくつかの古いブラウザにECMAScript5中の方法を追加します.
 
    if (!Array.prototype.map) {
        Array.prototype.map = function() {
            //code
        };
    }

原型でオブジェクトを拡張
js元のオブジェクトに対する拡張は、prototypeに登録することにほかならない.例えば、Stringオブジェクトにltrim,rtrimなどの方法を拡張することができる.jsの各オブジェクトはObjectから継承され、オブジェクトやその他の属性はprototypeオブジェクトで継承される.prototypeペアを通じて、内に建てられたオブジェクトを含めて、任意のオブジェクトを拡張することができる.679142:
Stringオブジェクトの拡張

    if(typeof String.prototype.ltrim=='undefined'){
        String.prototype.ltrim = function(){
            var s = this;
            s = s.replace(/^\s*/g, '');
            return s;
        }
    }

    if(typeof String.prototype.rtrim=='undefined'){
        String.prototype.rtrim = function(){
            var s = this;
            s = s.replace(/\s*$/g, '');
            return s;
        }
    }

    if(typeof String.prototype.trim=='undefined'){
        String.prototype.trim = function(){
            return this.ltrim().rtrim();
        }
    }

    if(typeof String.prototype.htmlEncode=='undefined'){
        String.prototype.htmlEncode = function(encodeNewLine){//encodeNewLine:  encode   
            var s = this;
            s = s.replace(/&/g, '&amp;');
            s = s.replace(/</g, '&lt;');
            s = s.replace(/>/g, '&gt;');
            s = s.replace(/'/g, '&quot;');
            if(encodeNewLine){
                s = s.replace(/\r
/g, '<br />'); s = s.replace(/\r/g, '<br />'); s = s.replace(/
/g, '<br />'); } return s; } }
Dateオブジェクトの拡張String:何月何日ありますか?
Date.getDaysInMonth = function (year, month) {
            var days = 0;
            switch (month) {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    days = 31
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    days = 30;
                    break;
                case 2:
                    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
                        days = 29;
                    else
                        days = 28;
                    break;
            }
            return days;
        }

        if (typeof Date.prototype.format == 'undefined') {
            Date.prototype.format = function (mask) {

                var d = this;

                var zeroize = function (value, length) {

                    if (!length) length = 2;

                    value = String(value);

                    for (var i = 0, zeros = ''; i < (length - value.length); i++) {

                        zeros += '0';

                    }

                    return zeros + value;

                };

                return mask.replace(/"[^"]*"|'[^']*'|\b(?:d{1,4}|m{1,4}|yy(?:yy)?|([hHMstT])\1?|[lLZ])\b/g, function ($0) {

                    switch ($0) {

                        case 'd': return d.getDate();

                        case 'dd': return zeroize(d.getDate());

                        case 'ddd': return ['Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat'][d.getDay()];

                        case 'dddd': return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][d.getDay()];

                        case 'M': return d.getMonth() + 1;

                        case 'MM': return zeroize(d.getMonth() + 1);

                        case 'MMM': return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][d.getMonth()];

                        case 'MMMM': return ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][d.getMonth()];

                        case 'yy': return String(d.getFullYear()).substr(2);

                        case 'yyyy': return d.getFullYear();

                        case 'h': return d.getHours() % 12 || 12;

                        case 'hh': return zeroize(d.getHours() % 12 || 12);

                        case 'H': return d.getHours();

                        case 'HH': return zeroize(d.getHours());

                        case 'm': return d.getMinutes();

                        case 'mm': return zeroize(d.getMinutes());

                        case 's': return d.getSeconds();

                        case 'ss': return zeroize(d.getSeconds());

                        case 'l': return zeroize(d.getMilliseconds(), 3);

                        case 'L': var m = d.getMilliseconds();

                            if (m > 99) m = Math.round(m / 10);

                            return zeroize(m);

                        case 'tt': return d.getHours() < 12 ? 'am' : 'pm';

                        case 'TT': return d.getHours() < 12 ? 'AM' : 'PM';

                        case 'Z': return d.toUTCString().match(/[A-Z]+$/);

                            // Return quoted strings with the surrounding quotes removed     

                        default: return $0.substr(1, $0.length - 2);

                    }

                });

            };
        }
オリジナルjsを使ってコピーオブジェクトと拡張を実現します.DategetDaysInMonth方法は、オリジナルjQueryを使用して複製オブジェクトを実現し、extend()jsの方法と同様に、拡張オブジェクトを容易に実現することができる.
var obj1 = {
    name : 'trigkit4',
    age : 22
};
var obj2 = {
    name : 'frank',
    age : 21,
    speak : function(){
        alert("hi, I'm + name ");
    }
};

var obj3 ={
    age : 20
};

function cloneObj(oldObj) { //      
    if (typeof(oldObj) != 'object') return oldObj;
    if (oldObj == null) return oldObj;
    var newObj = Object();
    for (var i in oldObj)
        newObj[i] = cloneObj(oldObj[i]);
    return newObj;
}

function extendObj() { //    
    var args = arguments;//             args  
    if (args.length < 2) return;
    var temp = cloneObj(args[0]); //        
    for (var n = 1; n < args.length; n++) {
        for (var i in args[n]) {
            temp[i] = args[n][i];
        }
    }
    return temp;
}
var obj =extendObj(obj1,obj2,obj3);
console.log(obj);//{ name: 'frank', age: 20, speak: [Function] }
console.log(obj1);//{ name: 'trigkit4', age: 22 }
console.log(obj2);//{ name: 'frank', age: 21, speak: [Function] }
console.log(obj3);//{ age: 20 }
es 5-safeモジュールjQueryモジュールには、より良い実装が可能な安全に使用できる部分的な方法のみが拡張されている.
Function.prototype.bind
Object.create
Object.keys
Array.isArray
Array.prototype.forEach
Array.prototype.map
Array.prototype.filter
Array.prototype.every
Array.prototype.some
Array.prototype.reduce
Array.prototype.reduceRight
Array.prototype.indexOf
Array.prototype.lastIndexOf
String.prototype.trim
Date.now
詳細:http://es5.github.io/
オブジェクトの作成extend()は、4つのタイプのオブジェクトをサポートする.内部オブジェクト、生成されたオブジェクト、ホストが与えるオブジェクト(例えば、Internetブラウザのes5-safeおよびJavaScript)、およびwindowオブジェクト(外部構成要素).documentは11個の内部(または「内蔵」)オブジェクトを提供しています.ActiveX及びMicrosoft Jscriptオブジェクトです.各オブジェクトは関連する方法と属性があります.Array、Boolean、Date、Function、Global、Math、Number、Object、RegExp、Errorにおけるオブジェクトの作成には、以下のような方法がある.
(1)      
(2)  JSON  
(3)       
一、内蔵オブジェクトを使う
JavaScript            :

1,JavaScript      (     ), String、Object、Function ;
2,JavaScript        (       ), window、document、body 。
オブジェクトリストを内蔵
Array
Boolean
Date
Error
EvalError
Function
Infinity
JSON
Map
Math
NaN
Number
Object
ParallelArray
Promise
Proxy
RegExp
Set
String
Symbol
SyntaxError
Uint32Array
WeakSet
decodeURI
decodeURIComponent()
encodeURI()
encodeURIComponent()
escape()   
eval()
isFinite()
isNaN()
null
parseFloat
parseInt
undefined
以上の資料は以下の通りです.https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects#.E5.9F.BA.E6.9C.AC.E5.AF.B9.E8.B1.A1
カスタムオブジェクトの構造
上位オブジェクト構造を作成するには、「String」というキーワードを使った構造と、原型JavaScriptを用いて構成される2つの方法があります.
デートオブジェクト
getシリーズの方法
getDate()   Date              (1 ~ 31)。
getDay()   Date             (0 ~ 6)。
getMonth()   Date        (0 ~ 11)。
getFullYear()   Date            。      getYear()。
getHours()    Date       (0 ~ 23)。
getMinutes()    Date       (0 ~ 59)。
getSeconds()    Date       (0 ~ 59)。
getMilliseconds()    Date      (0 ~ 999)。
getTime()    1970   1   1        。
getTimezoneOffset()                 (GMT)     。
getUTCDate()        Date           (1 ~ 31)。
getUTCDay()        Date           (0 ~ 6)。
getUTCMonth()        Date        (0 ~ 11)。
getUTCFullYear()        Date           。
getUTCHours()         Date       (0 ~ 23)。
getUTCMinutes()         Date       (0 ~ 59)。
getUTCSeconds()         Date       (0 ~ 59)。
getUTCMilliseconds()         Date      (0 ~ 999)。
セットシリーズの方法
setDate()    Date          (1 ~ 31)。
setMonth()    Date       (0 ~ 11)。
setFullYear()    Date       (    )。      setYear()  。
setHours()    Date        (0 ~ 23)。
setMinutes()    Date        (0 ~ 59)。
setSeconds()    Date        (0 ~ 59)。
setMilliseconds()    Date        (0 ~ 999)。
setTime()       Date   。
setUTCDate()         Date          (1 ~ 31)。
setUTCMonth()         Date        (0 ~ 11)。
setUTCFullYear()         Date       (    )。
setUTCHours()         Date        (0 ~ 23)。
setUTCMinutes()         Date        (0 ~ 59)。
setUTCSeconds()         Date        (0 ~ 59)。
setUTCMilliseconds()         Date        (0 ~ 999)。
toStringシリーズの方法
toString()   Date         ,toString()                 。
toTimeString()   Date              。
toDateString()   Date              。
toUTCString()      ,  Date         。
toLocaleString()         ,  Date         。
toLocaleTimeString()         ,  Date              。
toLocaleDateString()         ,  Date              。
Arayオブジェクト
属性
constructor
               。

index
                     ,            0.

input
                     ,        。
length  
             .

prototype
               .
方法
これらの方法は配列自体を変えることができます.
pop
               ,          。

push
                    ,           。

reverse
              ,               ,                    ,             。

shift
              ,         。

sort
               。

splice
                    。

unshift
                    ,           。
Access orメソッド
これらのプロセスは配列自体を変更しません.
concat
                   /         
indexOf
                        ,       -1。
join
                    。

lastIndexOf
                           (  )  。

slice
            。

toSource
    Returns an array literal representing the specified array; you can use this value to create a new array. Overrides the Object.toSource method.

toString
                  ,  Object.toString   .

valueOf
    Returns the primitive value of the array. Overrides the Object.valueOf method.
ループ(反復)プロセス
filter
                          ,            true                。

forEach
                         。

every
                           ,    。

map
    Creates a new array with the results of calling a provided function on every element in this array.

some
                         ,   true。
まとめ:
        :pop()、push()、reverse()、shift()、sort()、splice()、unshift()

         :concat()、join()、slice()、toString()

ボロア
属性
Boolean.length
        ,  1.
Boolean.prototype
      Boolean      .   
方法
Boolean.prototype.toSource() 
Boolean.prototype.toString()
Boolean.prototype.valueOf()
Stringオブジェクト
属性
String.length
String.prototype
方法:
charAt()             。stringObject.charAt(index)

charCodeAt()               Unicode   。       0 – 65535      。 stringObject.charCodeAt(index)

concat()               。
stringObject.concat(stringX, stringX, …, stringX)
   
indexOf()                           。
stringObject.indexOf(searchvalue, fromindex)

lastIndexOf()                      ,                  。

localeCompare():                stringObject.localeCompare(target)

match()               ,                。
      indexOf()   lastIndexOf(),         ,         。
stringObject.match(regexp)


replace()                      ,                。stringObject.replace(regexp/substr, replacement)

search()                  ,                 。
stringObject.search(regexp)

slice()              ,               。
stringObject.slice(start, end)

substring()     ,    slice()  。

substr()     ,    slice()  。

toLocaleLowerCase()     ,              ,    toLowerCase()  。

toLocaleUpperCase()     ,              ,    toUpperCase()  。

toLowerCase()              。

toUpperCase()              。
thisオブジェクトの方法prototypeおよびStringは、文字列の指定された部分を返すことができます.すべての場合にslice()、substring()方法を使用することを強く推奨します.
RegExpオブジェクト
属性
 RegExp.prototype.constructor
             。
 
 RegExp.prototype.global
         ,                   ,           。

 RegExp.prototype.ignoreCase
                   。

 RegExp.prototype.lastIndex
               。

 RegExp.prototype.multiline
           (   ^   $    )

 RegExp.prototype.source
           。
方法
 RegExp.prototype.exec()
                     。
 RegExp.prototype.test()
                    。
 
RegExp.prototype.toString()
           ,              。   Object.prototype.toString()   。 
Objectオブジェクト
非構造関数として呼び出された場合、substr()slice()と同等である.
属性または方法Objectの各例は、共通の基本的な属性および方法を有する.
属性または方法
説明
トラック
現在のオブジェクトを作成するためのコンストラクターを指します.
hasOwnProperty(name)
与えられた属性nameがインスタンスオブジェクトに存在するかどうかを検出します.nameは文字列で指定します.
isPropertyOf(object)
導入されたオブジェクトを検出します.この方法の使用者の原型オブジェクトですか?一般フォーマット:Class.prototype.isPropertyOf(object)
propertyIs Enumerable(pr)
属性prをfor-innでエニュメレーションできますか?属性proは文字列で指定します.
toLocale String()
オブジェクトの文字列表示を返します.地域や環境に対応しています.
toString()
オブジェクトの文字列表示を返します.
valueOf()
オブジェクトの文字列、数値、またはブール値の表現を返します.
静的方法
Object.create(prototype, descriptors)
          ,    (  )        
        
Object.defineProperty(object, propertyname, descriptor)
                   

Object.defineProperties(object, descriptors)
                           
    
Object.getOwnPropertyDescriptor(object, propertyname)
       

Object.getOwnPropertyNames(object)
         ,           

Object.preventExtensions(object)
           

Object.isExtensible(object)
          

Object.seal(object)
                   

Object.freeze(object)
             ,         。

Object.isFrozen(object)
           

Object.getPrototypeOf(object)
         

グローバル属性と方法
全体の方法
グローバル属性