在javascript中,似乎一个对象继承自一个函数,它根本就不能使用name属性。我已经在node.js中对此进行了测试,并且在各种浏览器中可能都是如此。 E.g:
var A = function() {}
A.prototype = function() {}
var x = new A()
x.name = "bob"
console.log(x.name) // logs blank
在这种情况下,你无法覆盖对象原型中给出的属性(即__proto__
)似乎是荒谬的。我疯了吗?
答案 0 :(得分:1)
这不是因为功能,而是因为writable
false
的名称有descriptor
in the prototype。 Object.getOwnPropertyDescriptor(function(){}, "name").writable === false
如果您正常创建描述的不可写属性,也会发生同样的情况:
function A() {
}
Object.defineProperty( A.prototype, "name", {
value: ""
});
var a = new A()
a.name
//""
a.name = "bob"
//"bob"
a.name
//""
您需要通过Object.defineProperty
来执行此操作:
Object.defineProperty(x, "name", {value: "bob"})
x.name
//"bob"