2017-06-30 9 views
0

私は最近、javascript-spessoreのようなjavascriptに関するいくつかの本を勉強しています。 と私はjavascriptで構築されていないextendのようなコード例をいくつか見つけました。についてjavascript extend function

var WidgetModel = function(id, attrs) { 
    extend(this, attrs || {}); 
    this.id = function() { 
    return id 
    } 
} 

    extend(WidgetModel.prototype, { 
    set: function(attr, value) { 
    this[attr] = value; 
    return this; 
    }, 
    get: function(attr) { 
    return this[attr] 
    } 
}); 

そしてもちろん、それはエラーメッセージ動作と表示されない: キャッチされないにReferenceError:延びるが定義されていない コードスニペットは、次の通りです。 私の問題は、上部の コードスニペットをうまく機能させるためにextendのような関数を作成する方法です。 ご意見ありがとうございます。

答えて

2

サポートされている環境では、あなたは、単に使用することができます...

let extend = Object.assign; 

...あるいは単に直接Object.assign()を使用します(これは好ましいであろう)。それはサポートされていない場合

、あなたは簡単に十分にそれを手動で行うことができます...

var extend = function(destination, source) { 
    for (var prop in source) { 
     if (Object.prototype.hasOwnProperty.call(source, prop)) { 
      destination[prop] = source[prop]; 
     } 
    } 
}; 
+0

@Ryan私はそれを書くのが面倒だったが、あなたは正しいです。 – alex

+0

なぜ 'source.hasOwnProperty(prop)'ではなく 'Object.prototype.hasOwnProperty.call(source、prop)'ですか?そしてなぜ関数宣言の代わりに関数式を使用するのですか? – RobG

+0

@RobG 'source'オブジェクトが直接それに定義されている場合(まれな状況)、宣言よりも関数式が本当の理由ではありません。 – alex

-2

var WidgetModel = function() { 
 
} 
 

 
WidgetModel.prototype.name ='can'; 
 
WidgetModel.prototype.sayAge = function(age) { 
 
\t return age; 
 
} 
 

 
var model = new WidgetModel(); 
 

 
console.log(model.name); 
 
console.log(model.sayAge(20));