覆盖对象属性Javascript

时间:2014-01-30 03:33:00

标签: javascript

我基本上很难理解为什么在使用来自另一个对象的继承时我不能覆盖对象属性,它就像这样。

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

Object.defineProperties(Person.prototype, {
  sayHi : {
   value :function() {
     return "Hi there";
   },
   enumerable : true,
   writable : true
  },
 fullName : {
   get : function() {
    return this.firstName + " " + this.lastName;  
   },
   enumerable : true
  }                      
});


var createEmployee = function(firstName, lastName, ocupation) {
  var employee = new Person(firstName, lastName);
  employee.ocupation = ocupation;  

 Object.defineProperty(employee, "sayHi", {
   sayHi : {
    value : function() {
     return "Hey I am " + this.firstName;
    }
   }
 });

 return employee;
};

var janeDoe = createEmployee('Jane', 'Doe', 'Actress');

因此,根据我的理解,我应该覆盖employee对象上的sayHi属性,但是,我将其视为未定义。

可以请一些人给我看钱吗?

这是jsfiddle

最诚挚的问候。

3 个答案:

答案 0 :(得分:3)

刚刚意识到我给出的答案很糟糕。

您不需要对象内的名称。

Object.defineProperty(employee, "sayHi", {
sayHi : {//<- don't need this.
    value : function() {
    return "Hey I am " + this.firstName;
  }
 }//<- or this.
});

答案 1 :(得分:0)

试试这个:

 Object.defineProperty(employee, "sayHi", {
   value: "Hey I am " + employee.firstName
 });

另外,Mozilla对Object.defineProperty()的解释非常好,你应该检查一下。

答案 2 :(得分:0)

您可以使用过时的Object.defineProperty()Object.assign()。但是,有一种更清洁,更现代的解决方案。

只需:

objectName = {...objectName, property: "newvalue"};
// or
objectName = {property: "newvalue", ...objectName};

两者之间的区别在于,第一个将覆盖名为property的属性,而第二个将创建一个名为property的新属性并分配一个值,但是不会覆盖它如果已经存在。

看看JS spread syntax以获得更多信息。

也可以通过以下步骤设置原型:

Person.prototype = {...Person.prototype, sayHi: _=>"Hi there!"};