如何将类似原型的属性添加到现有对象?

时间:2017-08-21 22:13:37

标签: javascript

我从一个简单的对象开始:

var person = { name: 'Joe', age: 21 };

我想在没有使用hasOwnProperty的方法时向该对象添加方法。 因此,例如,让我们创建一个生日方法,只是增加人的年龄。

var birthday = function() { this.age++; };

如何将其添加到person对象,如果我说:

for(var i in person) {
  console.log(i);
}

我会得到:

name: 'Joe'
age: 21
birthday: function() { ... }

但如果我说:

for(var i in person) {
  if(person.hasOwnProperty(i)) {
    console.log(i, person[i]);
  }
}

我会得到:

name: 'Joe'
age: 21

2 个答案:

答案 0 :(得分:4)



var person = { name: 'Joe', age: 21 };

Object.defineProperty(person, 'birthday', {
  enumerable: false,
  configurable: false,
  writable: false,
  value: function() { this.age++; }
});

function showPerson() {
  for(var i in person) {
    if(person.hasOwnProperty(i)) {
      console.log(i, person[i]);
    }
  }
}

showPerson();
person.birthday();
showPerson();




如果迭代方法没有hasOwnProperty很重要, 那么以下想法可能有用......



var person = { name: 'Joe', age: 21 };

var extend = {
  birthday: function () { this.age ++ }
}

var person = Object.assign(
  Object.create(extend),
  person);
  

function showPerson() {
  for(var i in person) {
    if(person.hasOwnProperty(i)) {
      console.log(i, person[i]);
    }
  }
}

function showPersonFull() {
  for(var i in person) {
    console.log(i, person[i]);
  }
}

showPerson();
person.birthday();

showPersonFull();




答案 1 :(得分:0)

将其添加为另一个属性。

person.birthday = function() { this.age++; };



var person = { name: 'Joe', age: 21 };
person.birthday = function() { this.age++; };
for(var i in person) {
  console.log(i);
}
person.birthday();
console.log(person.age);
for(var i in person) {
  if(person.hasOwnProperty(i)) {
    console.log(i, person[i]);
  }
}