2016-07-09 5 views
0
  1. 私は、javascriptでPersonオブジェクトを作成するためにFactoryパターンを使用しようとしています。これを実行している間、私は、オブジェクトを作成している間、関数のプロパティを列挙できないように設定しようとしています。しかし、それは効力を発揮していないようです。なぜそれがまだ関数のプロパティを列挙しているのか教えてください。ファクトリパターン - Javascriptコード - 関数を列挙しないようにする

  2. definePropertyの呼び出しで、関数名だけを渡すと、printPersonDetailsが定義されていないというエラーが表示されます。 obj.printPersonDetailsを渡して動作させる必要があります。あなたがObject.definePropertyを使用する方法だけではありません


function createPerson(name, age ,sex){ 
var obj = new Object(); 
obj.name = name; 
obj.age = age; 
obj.sex = sex; 
obj.printPersonDetails = function(){ 
console.log("Name: "+ obj.name + " Age: "+ obj.age); 
} 
Object.defineProperty(obj,obj.printPersonDetails , {     
    writeable:false, 
     enumerable:false, 
     configurable: false 
    }); 

return obj; 
} 
var person1 = createPerson("salman", 29,"M"); 
var person2 = createPerson("rahman", 59,"M"); 
var person3 = createPerson("sarah", 19,"F"); 

//person1.printPersonDetails(); 
//console.log(person1) 

for(prop in person1){ 
console.log(prop +"->" + person1[prop])} 

出力

C:\dev\javascript>node constructorpattern.js 
name->salman 
age->29 
sex->M 
printPersonDetails->function(){ 
    console.log("Name: "+ obj.name + " Age: "+ obj.age); 
    } 
+0

''グローバル変数を作成している(PERSON1で支える)のために、あなたはほとんど常に避けるべきです。 – gcampbell

答えて

0

間違っ:

obj.printPersonDetails = function(){ 
    console.log("Name: "+ obj.name + " Age: "+ obj.age); 
} 

Object.defineProperty(obj,obj.printPersonDetails , {     
    writeable:false, 
    enumerable:false, 
    configurable: false 
}); 

右:

function printPersonDetails(){ 
    console.log("Name: "+ this.name + " Age: "+ this.age); 
} 

Object.defineProperty(obj, 'printPersonDetails' , {     
    writeable:false, 
    enumerable:false, 
    configurable: false, 
    value: printPersonDetails 
}); 

しかし、私はあなたが本当にやりたいと思うことは、別のオブジェクトにユーティリティ関数を入れています。

JavaScriptには、オブジェクトインスタンス(つまり、for..inの問題は解決していませんが)のオブジェクトインスタンスからの機能を維持するためのビルトインサポートが組み込まれています。

ので、代わりの:

あなたが使用することができ
var obj = new Object(); 

var obj = Object.create({ printPersonDetails }); 

そして代わりに、プロパティを表示しないようにするにObject.keysを使用することができfor...inの。

もう1つの方法は、printPersonalDetails機能を別のオブジェクトに完全に保持することです(これはおそらく私のやり方です)。

編集:

次は、単に思考のための食品ではなくオススメです。

var DEFAULT_PROPERTIES = { 
 
    name: null, 
 
    age: null, 
 
    eyeColor: null, 
 
    sex: null, 
 
}; 
 

 
function personFactory(options){ 
 
    return Object.assign({}, DEFAULT_PROPERTIES, options); 
 
} 
 

 
function personPrinter(person) { 
 
    document.write("Name: "+ person.name + " Age: "+ person.age); 
 
} 
 

 
var person = personFactory({ name: "salman", age: 29, sex: "M" }); 
 
personPrinter(person);

+0

Ben Astonさん、ありがとうございました! – megan

+0

こんにちはベン。「別のアプローチは、printPersonalDetails関数を別のオブジェクトに完全に保持することです(これはおそらく私がやることです)。 - これを説明するコードスニペットを提供していただけますか? – megan

+0

*プロトタイプには、プロパティが列挙可能かどうかは何も関係ありません。実際には(ES2015の構文に依存しています) 'enumerable ** 'プロパティーを作成します。このプロパティーは、' createPerson'で作成されたオブジェクトのfor-inループに表示されます。あなたは 'printPersonDetails'を列挙できないプロトタイプオブジェクトを作成することができますが、' this'に依存します。これは、通常、 'createPerson'のようなもので避けようとしているものです。 –

1

。ここでは例です:

Object.defineProperty(obj, "printPersonDetails", { 
    value: function(){ 
     console.log("Name: "+ obj.name + " Age: "+ obj.age); 
    } 
}); 

Object.definePropertyは様々なフラグ(writableenumerableconfigurablefalseにデフォルトを受け入れます。だからではなくを実行して、enumerable: trueを実行しています。

はここで、オブジェクトの残りのための機能とオブジェクト初期化構文についてdefinePropertyを使用した、完全なcreatePersonです:

function createPerson(name, age ,sex){ 
 
    var obj = { 
 
    name: name, 
 
    age: age, 
 
    sex: sex 
 
    }; 
 
    Object.defineProperty(obj, "printPersonDetails", { 
 
    value: function(){ 
 
     console.log("Name: "+ obj.name + " Age: "+ obj.age); 
 
    } 
 
    }); 
 
    return obj; 
 
} 
 

 
var person1 = createPerson("salman", 29,"M"); 
 
for (var prop in person1) { 
 
    console.log(prop + "->" + person1[prop]); 
 
}


サイドノート:何らかの理由が事実上存在ことはありませんnew Object()を使用します。ちょうど{}を使用してください。

+1

Thanks Crowder ..新しいObject()の代わりに{}を使用していただきありがとうございます。 – megan

関連する問題