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();

现在您有两个单独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

Object函数(注意:同样,如果你不熟悉发生的事情,更令人吃惊的是,它适用于调用new Object(...))如果传递的不是布尔值、数字或字符串类型的东西,它就不会创建新对象;它只是返回已经存在的对象。(理由:因为它已经是一个对象。几乎所有东西都是 Javascript 中的一个对象。)

因此,anotherPerson是与 完全相同的对象person,所以当你修改它时,你也修改它person

我并不认为这是明智的行为;但这是语言规范定义的。

于 2012-04-27T20:06:26.433 回答
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

JavaScript中继承实现的通用解决方案

function inherits(base, extension)
{
   for ( var property in base )
   {
      try
      {
         extension[property] = base[property];
      }
      catch( warning ){}
   }
}
于 2013-03-30T22:14:10.653 回答