![](/img/trans.png)
[英]JavaScript overwrite Object property enumerability still not enumerable
[英]overwrite object property 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');
因此,根据我的理解,我应该覆盖员工对象上的 sayHi 属性,但是,我认为它未定义。
可以请一些人给我看钱吗?
这是jsfiddle
此致。
您可以使用过时的Object.defineProperty()
或Object.assign()
。 但是,对此有一个更清洁、更现代的解决方案。
简单地做:
objectName = {...objectName, property: "newvalue"};
// or
objectName = {property: "newvalue", ...objectName};
两者的区别在于,第一个将覆盖名为property
,而第二个将创建一个名为property
的新property
并赋值,但是,如果它已经存在,则不会覆盖它。
查看JS 扩展语法以获取更多信息。
这也可以用于设置您的原型:
Person.prototype = {...Person.prototype, sayHi: _=>"Hi there!"};
刚刚意识到我给出的答案很糟糕。
您不需要那里的对象内的名称。
Object.defineProperty(employee, "sayHi", {
sayHi : {//<- don't need this.
value : function() {
return "Hey I am " + this.firstName;
}
}//<- or this.
});
尝试这个:
Object.defineProperty(employee, "sayHi", {
value: "Hey I am " + employee.firstName
});
此外,Mozilla 对Object.defineProperty()的解释非常出色,您应该查看一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.