6

次のコードがあるとします。

function Person(firstName, lastName) {
    this.FirstName = firstName;
    this.LastName = lastName;
}

Person.prototype.showFullName = function() {
    return this.FirstName + " " + this.LastName;
};

var person = new Person("xx", "xxxx");
var jsonString = JSON.stringify(person);

var thePerson = JSON.parse(jsonString);

ここでの私の目標は、thePerson で「showFullName」を呼び出せるようにすることです。JS には実際にはオブジェクトがないことは理解していますがthePersonPerson.

4

5 に答える 5

2

無理です。

以前のメソッドでは、JSON 文字列をオブジェクトに変換することはできません。

于 2012-06-13T14:22:55.487 に答える
2

私の知る限り、これを行う最善の方法は、最初にバニラ オブジェクトを構築し、次に jQuery のextendsのようなものを使用してその上にデータを配置することです。

var thePerson = new Person(); // and make sure the constructor gracefully handles no arguments
jQuery.extend(thePerson, JSON.parse(stringData));

以下で説明するように、extendここにある浅いコピーを作成するだけの場合は使用する必要はありません。解析されたデータのプロパティをループして、ターゲット オブジェクトにコピーするだけです。

于 2012-06-13T14:24:27.213 に答える
2

他の言語の言語構造を持つほとんどのものと同様に、直接行うことはできませんが、Javascript でそれを回避する方法があります。コンストラクターとして公開するすべてのデータを受け入れるようにオブジェクトを設定するだけです。

var data = JSON.parse(jsonString);
var person = new Person(data);

最初から:

var person = new Person({ FirstName: "xx", LastName: "xxx"});

(注意 -$.extendなどを使用して代わりに既存のインスタンスを更新することもできますが、一般的には、渡されたオブジェクトの処理を制御できるように、コンストラクターを使用することをお勧めします。たとえば、特定のプロパティを除くすべてを無視したい場合があります。渡されたオブジェクトの)。

于 2012-06-13T14:26:40.340 に答える
0

JS には実際にはオブジェクトがないことは理解していますが、何かを特定の方法で処理する必要があると言える何らかの方法が必要です。

正しくありません。JS にはたくさんのオブジェクトがあります。関数自体はオブジェクトです。私の知る限り、オブジェクトではない唯一のものはプリミティブ型です。おそらくあなたが言いたいのは、Javascript にはクラスの概念がないということです。JS はプロトタイプの継承を使用するため、それは正しいでしょう。

一般的に、キャストは JS では意味がありません。もしあなたがそうするなら

x.someMethod()

someMethod はx、型に関係なく、 on で定義されている場合に起動しxます。ダックタイピングといいます。

JSON.parseを作成しobject literalます。最善の方法は、オブジェクト リテラルを受け取り、インスタンスの値を初期化するコンストラクタを作成することです。

于 2012-06-13T14:25:15.857 に答える
0

オブジェクトをコンストラクターにフィードできる一種のラッパー クラスを作成すると、各プロパティがそのオブジェクトのプロパティとして設定されます。これを「ベースクラス」にして、あらゆる種類のオブジェクトに使用できます。そうすれば、その基本クラスから「継承」するクラスの新しいインスタンスを作成し、それをオブジェクトでフィードするだけで済みます。http://backbonejs.org/で使用されているようなモデルのようなもの

于 2012-06-13T14:25:28.983 に答える