JSONで定義された既存のオブジェクトの配列があります。オブジェクトは明らかにオブジェクトタイプです。それらをカスタムオブジェクトタイプに関連付けて、特定の機能を提供するにはどうすればよいですか?
5 に答える
すべてのブラウザで機能する方法は、配列内の各アイテムを必要なプロパティとメソッドで拡張するか、オブジェクトをコンストラクタに渡して、古いオブジェクトのプロパティとメソッドに基づいて新しいオブジェクトを作成することです。
または、IEを気にしない場合:
var obj = {
name : "Jeremy"
};
function CustomType() {
this.name = this.name || "someValue";
this.greeting = "Hi";
}
CustomType.prototype.sayHi = function() {
alert(this.greeting + ", " + this.name);
};
obj.__proto__ = CustomType.prototype;
obj.constructor.call(obj);
obj.sayHi();
一度作成したオブジェクトの種類を変更する方法はないと思います。幸いなことに、オブジェクトのクラスを実際に変更する必要はおそらくありません。オブジェクトにいくつかの新しいメソッドやその他の機能を与えることに満足するでしょう。(唯一の本当の違いは、クラスを変更した場合に何が起こるかであり、ほとんどの人はコードの実行中にクラスを変更しません。)
私はあなたのために例を作ります。まず、所有しているJSONオブジェクトを表す単純なオブジェクトを作成します。
var myobj = new Object()
myobj.name = "Fred"
次に、割り当てられるようにしたいクラスを作成しますmyobj
。
function Speaker() {
this.speak = function() {
window.alert("Hello, " + this.name);
}
}
この新しいSpeaker
クラスにはいくつかの便利な機能があります。メソッドを使用してspeak()
有用な情報を出力できます。
var s = new Speaker()
s.name = "Sally"
s.speak()
それを実行すると、「こんにちは、サリー」というメッセージが表示されました。残念ながら、s
この機能を備えたNEWオブジェクト(のような)は必要ありません。既存のオブジェクト(myobj
)にそれを持たせたいのです。これを行う方法は次のとおりです。
myobj.speak = s.speak
これを実行すると:
myobj.speak()
「こんにちは、フレッド」というメッセージが表示されます。
要約すると、必要なことを実行するオブジェクトを作成します。すべてのメソッド(およびヘルパー変数)を新しいオブジェクトにコピーします。継承のいくつかの異常な使用を除いて、これはあなたの新しいオブジェクトを望み通りに振る舞わせます。
コンストラクターが必要ない場合は、次のように実行できます。
Object.assign(new CustomType, {});
それらに特定のメソッドを使用する場合は、apply/callを使用できます。
または、カスタムオブジェクトのメソッドをコピーすることもできます。
function Object1() {
this.aValue = "10";
}
function CustomObject() {
this.customValue = "6";
}
function convertToCustom(obj) {
var custom = new CustomObject();
for( var key in obj ) {
custom[key] = obj[key];
}
return custom;
}
var obj = new Object1();
var custom = convertToCustom(obj);
console.log(custom.customValue); // <- 6
console.log(custom.aValue); // <- 10
Jeremyの回答を補足するものとして、 protoで直接遊ぶ代わりに、Object.createを使用できます。「拡張」機能も必要です。
したがって、ジェレミーの例を考えると、次のようなものがあります。
var obj = {
name : "Jeremy"
};
function CustomType() {
}
CustomType.prototype.init = function(){
this.name = this.name || "someValue";
this.greeting = "Hi";
return this; //let's make it fluent
}
CustomType.prototype.sayHi = function() {
console.log(this.greeting + ", " + this.name);
};
function extend(obj, props) {
for(prop in props) {
if(props.hasOwnProperty(prop)) {
obj[prop] = props[prop];
}
}
return obj; //let's make it fluent
}
obj = extend(Object.create(CustomType.prototype), obj).init();
obj.sayHi();