覆盖对象属性 Javascript

and*_*res 2 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');
Run Code Online (Sandbox Code Playgroud)

因此,根据我的理解,我应该覆盖员工对象上的 sayHi 属性,但是,我认为它未定义。

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

这是jsfiddle

此致。

Tec*_*ode 8

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

简单地做:

objectName = {...objectName, property: "newvalue"};
// or
objectName = {property: "newvalue", ...objectName};
Run Code Online (Sandbox Code Playgroud)

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

查看JS 扩展语法以获取更多信息。

这也可以用于设置您的原型:

Person.prototype = {...Person.prototype, sayHi: _=>"Hi there!"};
Run Code Online (Sandbox Code Playgroud)

  • 感谢你!但这个答案大约是五年后才出现的……当我需要你的时候你在哪里?啊??:@ (2认同)

Que*_*les 5

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

您不需要那里的对象内的名称。

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