2017-04-24 1 views
0

2つの異なるオブジェクトのコピーソーシングを区別するために、次の手法を使用しています。 o2.copyはディープコピーを行い、o3.copyはシャローコピーを行います。Javascript:変数に基づいた配列プッシュのカスタマイズ - いくつかのタイプの標準プッシュコールを可能にする

var o1 = {name: "old"}; 
console.log(o1); 
var o3 = {}; var o2 = {}; 
o2.copy = function(o){ 
    for (var key in o) {   
     o2[key] = ".."+o[key];   
    } 
}; 

o2.copy(o1); 
console.log(o2); 
o3.copy = function(o){  
    o3 = o; 
}; 
o3.copy(o1);  
console.log(o3); 
o2.copy(o1); 
o1.name = "New"; 
console.log(o2); 

これは問題なく動作します。私は、このようなAにプッシュにこのメソッドをオーバーライドすることができます今、私は今、私はこの配列A

のプッシュに深いコピーをバインドしたい配列A

var A = []; 

を持って

{ name: 'old' } 
{ copy: [Function], name: '..old' } 
{ name: 'New' } 
{ copy: [Function], name: '..old' } 

ところで、入ってくるargがオブジェクトであれば、それ以外のディープコピーを行うのでしょうか?何とかこれを行うことは可能ですか?

var A = []; 

A.push = function (o) { 
    if (typeof o === "object") { 
     A[A.length] = {} 
     for (var key in o) {   
      A[A.length-1][key] = o[key]; 
     } 
    } else { 
     console.log("Non-object push"); 
     push(); //<--- How to call the default array push here 
    } 
} 

A.push (o1); 
A.push ("Test"); 
o1.name = "new"; 
console.log(A[A.length-1].name) 

//現在の出力は、デフォルトの実装を取得するための関数オブジェクトのための

{ name: 'old' } 
+old 
{ name: 'NewAgain' } 
old 
Non-object push 

/temp/file.js:35 
     push(); 
     ^
ReferenceError: push is not defined 
    at Array.A.push (/temp/file.js:35:9) 
    at Object.<anonymous> (/temp/file.js:40:3) 
    at Module._compile (module.js:571:32) 
    at Object.Module._extensions..js (module.js:580:10) 
    at Module.load (module.js:488:32) 
    at tryModuleLoad (module.js:447:12) 
    at Function.Module._load (module.js:439:3) 
    at Module.runMain (module.js:605:10) 
    at run (bootstrap_node.js:418:7) 
    at startup (bootstrap_node.js:139:9) 

答えて

1

使用.call方法です。

var A = []; 

A.push = function (o) { 
    if (typeof o === "object") { 
     A[A.length] = {} 
     for (var key in o) {   
      A[A.length-1][key] = o[key]; 
     } 
    } else { 
     console.log("Non-object push"); 
     Array.prototype.push.call(this, o); //<--- How to call the default array push here 
    } 
} 
関連する問題