5

このコードを理解するのを手伝ってください。

var person = {
    'first-name': 'FirstName',
    'last-name': 'LastName',
    'gender': 'Male'
};

var anotherPerson = new Object(person);
anotherPerson.desig = 'Designation';

console.log('Another person designation: ' + anotherPerson['desig'] + ', person designation: ' + person['desig']);

出力が になると予想してAnother person designation: Designation, person designation: undefinedいましたが、驚いたことに、 であることがわかりました`Another person designation: Designation, person designation: Designation

私によると、オブジェクトをanotherPerson拡張しておりperson、に設定されたプロパティはオブジェクトanotherPersonに表示されるべきではありませんperson。私はここで間違っていますか?それとも、両方のオブジェクトが同じ場所を指しているのでしょうか?

[編集]

今、さらに多くの驚きがあります。

上記に次のコードを追加しました。

person.place = 'XYZ';
console.log(person['place'] + ', ' + anotherPerson['place']); // Expected: XYZ, undefined. Result: XYZ, XYZ.

上記の結果と回答に基づいて、両方のオブジェクトが同じ場所を参照していると思いました。今、さらにいくつかの行を追加しました

person = undefined;
console.log(anotherPerson['place']) //Expected: error, Result: XYZ. ??!?!?
console.log(person['place']) // Expected: error, Result: error.

誰かがこれを理解するために私に光を当てることができますか? 事前にご協力いただきありがとうございます

4

5 に答える 5

2

拡張や継承は行っていません。

これは近づいています:

var Person = function () {
    this["first-name"] = 'FirstName',
    this["last-name"] = 'LastName',
    this["gender"] = 'Male'
};

var person = new Person();
var anotherPerson = new Person();

これで、 の2 つの別個のインスタンスができPersonました。あなたもanotherPersonサブクラスになりたいなら..

var Person = function () {
    this["first-name"] = 'FirstName',
    this["last-name"] = 'LastName',
    this["gender"] = 'Male'
};

var AnotherPerson = function () {
    this.desig = "Designation";
}
AnotherPerson.prototype = new Person();   // inherit from Person
AnotherPerson.prototype.constructor = AnotherPerson;  // reset constructor

var person = new Person();
var anotherPerson = new AnotherPerson();

console.log(person.desig); // undefined
console.log(anotherPerson.desig); // Designation
于 2012-04-27T20:03:52.577 に答える
0

実際には解決策ではありませんが、私にとっては、オブジェクトを拡張できるようにクローンする方法は次のとおりです。

var anotherPerson = new Object();
for(i in person) anotherPerson[i]=person[i];

それ以外の

var anotherPerson = new Object(person);

その後、期待どおりに動作します。

于 2012-04-27T20:02:41.123 に答える
0

オブジェクトを拡張/継承したい場合は、次のことができます

var person = {
    'first-name': 'FirstName',
    'last-name': 'LastName',
    'gender': 'Male'
};
if (typeof Object.create !== 'function')
{
    Object.create=function(o)
    {
        function F(){}
        F.prototype=o;
        return new F();
    }
}
var newPerson=Object.create(person);
newPerson.age=25;
newPerson.gender="Female";

console.log(person.gender); // Male
console.log(newPerson.gender); // Female

console.log(person.age); // undefined
console.log(newPerson.age); // 25

フィドル

参考: JavaScript のプロトタイプ継承

于 2012-04-27T20:34:30.753 に答える
0

Object関数 (注: 何が起こっているのかよく知らない場合はさらに驚くべきことに、同じことが の呼び出しに適用されますnew Object(...)) は、ブール値、数値、または文字列型ではない何かが渡された場合、新しいオブジェクトを作成しません。既存のオブジェクトを返すだけです。(理由: すでにオブジェクトであるため。Javascript ではほとんどすべてがオブジェクトです。)

したがって、anotherPersonは とまったく同じオブジェクトなpersonので、それを修正すると自分も修正されpersonます。

これが賢明な行動であるとは主張しません。しかし、それは言語仕様が定義するものです。

于 2012-04-27T20:06:26.433 に答える